#
Minimal reproducible example
Ich glaube, es gab eine Regression in data.table
in Version 1.12.0 im Vergleich zu 1.11.8. TL;DR
Ich denke, die Implementierung von unique.data.table()
hat sich geändert und die neue Implementierung unterstützt keine komplexen Typen wie Listen in Spalten.
Einige Benutzer von uptasticsearch haben berichtet, dass sie eine Fehlermeldung von unserem Code erhalten haben, die so aussieht:
Fehler in forderv(x, by = by, sort = FALSE, retGrp = TRUE) :
Spalte 2 von by= (2) ist vom Typ 'list', wird noch nicht unterstützt
Nachdem ich heute Abend nachgeforscht habe, habe ich die Ursache des Problems gefunden und kann es reproduzieren. Ich glaube, dass sich das Verhalten von unique()
geändert hat, und ich würde diese Änderung als Rückschritt betrachten.
Am 1.12.0:
someDT <- data.table::data.table(
col1 = 1:2,
col2 = list(list(TRUE, FALSE), list(FALSE, TRUE))
)
unique(someDT)
Löst Fehler aus
Fehler in forderv(x, by = by, sort = FALSE, retGrp = TRUE) :
Spalte 2 von by= (2) ist vom Typ 'list', wird noch nicht unterstützt
Um auf die vorherige Version herunterzustufen, habe ich Folgendes über die Befehlszeile ausgeführt:
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
Nachdem ich v 1.11.8 installiert hatte, habe ich den obigen R-Code erneut ausgeführt
someDT <- data.table::data.table(
col1 = 1:2,
col2 = list(list(TRUE, FALSE), list(FALSE, TRUE))
)
unique(someDT)
Funktioniert wie erwartet und liefert:
col1 col2
1: 1 <list>
2: 2 <list>
Also ging ich auf die Schuld für unique.data.table() , um zu sehen, was . geändert. Es sah so aus, als ob zwischen 1.11.8 und jetzt keine wesentlichen Änderungen vorgenommen wurden, also dachte ich, ich sollte mir die Schuld für forderv()
ansehen.
Ich habe auch nichts Sinnvolles in der Schuld für forderv() gesehen .
Ich beschloss, noch etwas zu versuchen ... und suchte nach dem Text "noch nicht unterstützt" (aus der Fehlermeldung). Das führte mich zu forder.c
, dessen Schuld mich zu #3124 führte.
Soweit ich das beurteilen kann, ist diese PR die Ursache des oben genannten Problems. Es gibt keine Beschreibung in der PR, daher bin ich mir nicht sicher, ob dies eine unbeabsichtigte Nebenwirkung oder eine bekannte Regression ist, die in einer zukünftigen Version von data.table
behoben wird.
#
Output of sessionInfo()
R-Version 3.5.0 (2018-04-23)
Plattform: x86_64-apple-darwin15.6.0 (64-Bit)
Läuft unter: macOS High Sierra 10.13.6
Matrix-Produkte: Standard
BLAS: /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib
LAPACK: /Library/Frameworks/R.framework/Versions/3.5/Resources/lib/libRlapack.dylib
Gebietsschema:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
angehängte Basispakete:
[1] Statistiken Grafiken GrDevices Utils Datasets Methodenbasis
über einen Namensraum geladen (und nicht angehängt):
[1] Compiler_3.5.0 Tools_3.5.0 Yaml_2.2.0 Daten.Tabelle_1.12.0
Danke für den ausführlichen Bericht!
Danke @jameslamb! In 1.11.8 erhalten Sie auch den Fehler, wenn die Eindeutigkeit nicht vor der Spalte list
aufgelöst wird:
# 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
In diesem Beispiel habe ich col1
so geändert, dass es Duplikate enthält, sodass dann col2
benötigt wird, um über die Eindeutigkeit zu entscheiden.
v1.12.0+ überprüft die Typen aller Spalten im Voraus, bevor der Algorithmus gestartet wird. Wenn Sie diese Überprüfung im Voraus durchführen, wird die Parallelität intern einfacher.
Damit es funktioniert und die Spalten list
ausschließen, verwenden Sie das Argument by=
, um (wahrscheinlich) die ersten paar Spalten anzugeben. Da Unique auf list
-Spalten ohnehin nicht funktioniert hat, denke ich, dass es wahrscheinlich besser ist, explizit zu sein, als später plötzlich von dem Fehler überrascht zu werden, wenn Dups in den Nicht- list
-Spalten auftreten.
> unique(DT, by="col1")
col1 col2
1: 1 <list>
>
Ich werde etwas zu NEWS und einen Vorschlag zur Fehlermeldung hinzufügen ...
@mattdowle ah ok, macht Sinn! Vielen Dank für einen Blick und für die Klarstellung in der Fehlermeldung.
Hilfreichster Kommentar
Danke für den ausführlichen Bericht!