Data.table: Regresión en unique.data.table() a partir de data.table 1.12.0

Creado en 30 ene. 2019  ·  3Comentarios  ·  Fuente: Rdatatable/data.table

# Minimal reproducible example

Creo que ha habido una regresión en data.table en la versión 1.12.0 en relación con la 1.11.8. TL;DR

Creo que la implementación de unique.data.table() ha cambiado y que la nueva implementación no admite tipos complejos como listas en columnas.

Algunos usuarios de uptasticsearch informaron haber recibido un mensaje de error de nuestro código que se ve así:

Error en forderv(x, by = by, sort = FALSE, retGrp = TRUE):
La columna 2 de by= (2) es de tipo 'lista', aún no admitida

Después de investigar esta noche, encontré el origen del problema y puedo reproducirlo. Creo que el comportamiento de unique() ha cambiado y lo consideraría una regresión.

En 1.12.0:

someDT <- data.table::data.table(
    col1 = 1:2,
    col2 = list(list(TRUE, FALSE), list(FALSE, TRUE))
)
unique(someDT)

Genera error

Error en forderv(x, by = by, sort = FALSE, retGrp = TRUE):
La columna 2 de by= (2) es de tipo 'lista', aún no admitida

Para cambiar a la versión anterior, ejecuté lo siguiente desde la línea de comandos:

Rscript -e "remove.packages('data.table')"
wget http://cran.rstudio.com/src/contrib/Archive/data.table/data.table_1.11.8.tar.gz
R CMD INSTALL data.table_1.11.8.tar.gz

Una vez que tuve instalado v 1.11.8, volví a ejecutar el código R anterior

someDT <- data.table::data.table(
    col1 = 1:2,
    col2 = list(list(TRUE, FALSE), list(FALSE, TRUE))
)
unique(someDT)

Funciona como se esperaba y devuelve:

   col1   col2
1:    1 <list>
2:    2 <list>

Así que fui a culpar a unique.data.table() para ver qué tenía . cambió. Parecía que no se habían realizado cambios sustanciales entre 1.11.8 y ahora, así que pensé en buscar la culpa de forderv() .

Tampoco vi nada significativo en la culpa de forderv() .

Decidí probar una cosa más... buscando el texto "todavía no compatible" (del mensaje de error). Eso me llevó a forder.c , cuya culpa me llevó a #3124.

Por lo que puedo decir, este PR es la fuente del problema anterior. No hay una descripción en el PR, por lo que no estoy seguro de si se trata de un efecto secundario no deseado o de una regresión conocida que se solucionará en una versión futura de data.table .

# Output of sessionInfo()

R versión 3.5.0 (2018-04-23)
Plataforma: x86_64-apple-darwin15.6.0 (64 bits)
Corriendo bajo: macOS High Sierra 10.13.6

Productos Matrix: por defecto
BLAS: /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib
LAPACK: /Librería/Frameworks/R.framework/Versions/3.5/Resources/lib/libRlapack.dylib

lugar:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

Paquetes básicos adjuntos:
[1] stats graphics grDevices utils datasets métodos base

cargado a través de un espacio de nombres (y no adjunto):
[1] compilador_3.5.0 herramientas_3.5.0 yaml_2.2.0 datos.tabla_1.12.0

Comentario más útil

¡Gracias por el completo informe!

Todos 3 comentarios

¡Gracias por el completo informe!

Gracias @jameslamb! En 1.11.8, también obtiene el error si la unicidad no se resuelve antes de la columna list :

# with data.table 1.11.8 : 
DT = data.table(
    col1 = c(1,1),
    col2 = list(list(TRUE, FALSE), list(FALSE, TRUE))
)
unique(DT)
Error in forderv(x, by = by, sort = FALSE, retGrp = TRUE) : 
  Column 2 of 'by' (2) is type 'list', not yet supported

En ese ejemplo, cambié col1 para que contuviera duplicados, de modo que se necesita col2 para decidir la unicidad.

v1.12.0+ comprueba los tipos de todas las columnas por adelantado antes de iniciar el algoritmo. Hacer esta verificación por adelantado facilita las cosas internamente para el paralelismo.

Para que funcione y excluya las columnas list , use el argumento by= para especificar (probablemente) las primeras columnas. Dado que único en las columnas list no funcionó de todos modos, creo que probablemente sea mejor ser forzado a ser explícito, en lugar de sorprenderse repentinamente por el error más adelante cuando ocurran dups en las columnas que no sean list columnas.

> unique(DT, by="col1")
    col1   col2
1:     1 <list>
> 

Agregaré algo a NOTICIAS y una sugerencia al mensaje de error...

@mattdowle ah está bien, ¡tiene sentido! Gracias por echar un vistazo y por aclarar en el mensaje de error.

¿Fue útil esta página
0 / 5 - 0 calificaciones