Data.table: Régression dans unique.data.table() à partir de data.table 1.12.0

Créé le 30 janv. 2019  ·  3Commentaires  ·  Source: Rdatatable/data.table

# Minimal reproducible example

Je crois qu'il y a eu une régression de data.table dans la version 1.12.0 par rapport à la 1.11.8. TL;DR

Je pense que l'implémentation de unique.data.table() a changé et que la nouvelle implémentation ne prend pas en charge les types complexes comme les listes dans les colonnes.

Certains utilisateurs d' uptasticsearch ont signalé avoir reçu un message d'erreur de notre code qui ressemble à ceci :

Erreur dans forderv(x, by = by, sort = FALSE, retGrp = TRUE) :
La colonne 2 de by= (2) est de type 'list', pas encore prise en charge

Après enquête ce soir, j'ai trouvé la source du problème et je peux le reproduire. Je crois que le comportement de unique() a changé et je considérerais ce changement comme une régression.

Sur 1.12.0 :

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

Génère une erreur

Erreur dans forderv(x, by = by, sort = FALSE, retGrp = TRUE) :
La colonne 2 de by= (2) est de type 'list', pas encore prise en charge

Pour revenir à la version précédente, j'ai exécuté ce qui suit à partir de la ligne de commande :

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

Une fois la v 1.11.8 installée, j'ai réexécuté le code R ci-dessus

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

Fonctionne comme prévu et renvoie :

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

Je suis donc allé au blâme pour unique.data.table() pour voir ce qui avait . modifié. Apparemment, aucun changement substantiel n'a été apporté entre le 1.11.8 et maintenant, alors j'ai pensé à jeter un coup d'œil sur le blâme pour forderv() .

Je n'ai rien vu de significatif dans le blâme pour forderv() non plus.

J'ai décidé d'essayer encore une chose ... en recherchant le texte "pas encore pris en charge" (à partir du message d'erreur). Cela m'a conduit à forder.c , dont le blâme m'a conduit au #3124.

Autant que je sache, ce PR est la source du problème ci-dessus. Il n'y a pas de description sur le PR, donc je ne sais pas s'il s'agit d'un effet secondaire involontaire ou d'une régression connue qui sera corrigée dans une future version de data.table .

# Output of sessionInfo()

R version 3.5.0 (2018-04-23)
Plate-forme : x86_64-apple-darwin15.6.0 (64 bits)
Exécuté sous : macOS High Sierra 10.13.6

Produits matriciels : par défaut
BLAS : /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib
LAPACK : /Bibliothèque/Frameworks/R.framework/Versions/3.5/Resources/lib/libRlapack.dylib

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

forfaits de base attachés :
[1] stats graphiques grDevices utils datasets méthodes base

chargé via un espace de noms (et non attaché) :
[1] compilateur_3.5.0 outils_3.5.0 yaml_2.2.0 données.table_1.12.0

Commentaire le plus utile

Merci pour le rapport détaillé !

Tous les 3 commentaires

Merci pour le rapport détaillé !

Merci @jameslamb ! En 1.11.8, vous obtenez également l'erreur si l'unicité n'est pas résolue avant la colonne 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

Dans cet exemple, j'ai changé col1 pour contenir les doublons, de sorte que col2 est alors nécessaire pour décider de l'unicité.

v1.12.0+ vérifie les types de toutes les colonnes avant de démarrer l'algorithme. Faire cette vérification à l'avance facilite les choses en interne pour le parallélisme.

Pour le faire fonctionner et exclure les colonnes list , utilisez l'argument by= pour spécifier (probablement) les premières colonnes. Étant donné que les colonnes uniques sur list ne fonctionnaient pas de toute façon, je pense qu'il est probablement préférable d'être forcé d'être explicite, plutôt que d'être soudainement surpris par l'erreur plus tard lorsque des doublons se produisent dans le non- list colonnes.

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

Je vais ajouter quelque chose à NEWS et une suggestion au message d'erreur...

@mattdowle ah ok, c'est logique ! Merci d'avoir jeté un coup d'œil et d'avoir précisé le message d'erreur.

Cette page vous a été utile?
0 / 5 - 0 notes