Data.table: Regression in unique.data.table() ab data.table 1.12.0

Erstellt am 30. Jan. 2019  ·  3Kommentare  ·  Quelle: Rdatatable/data.table

# 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

Hilfreichster Kommentar

Danke für den ausführlichen Bericht!

Alle 3 Kommentare

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.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen