À partir de #4196 :
Lors du remplissage d'une colonne de liste, rbindlist s'écarte du comportement de tous les autres types de colonnes et renvoie des éléments NULL au lieu de NA :
> A = data.table(c1=0, c2=list(1:3))
> B = data.table(c1=1)
> rbind(A,B,fill=TRUE)
c1 c2
<num> <list>
1: 0 1,2,3
2: 1
Attendu:
> A = data.table(c1=0, c2=list(1:3))
> B = data.table(c1=1)
> rbind(A,B,fill=TRUE)
c1 c2
<num> <list>
1: 0 1,2,3
2: 1 NA
Devrions-nous changer ce comportement pour que les colonnes de liste remplissent les lignes avec des valeurs NA pour correspondre au comportement de fill=TRUE pour les autres types de colonnes ?
PR avec correctif fourni si nous voulons faire le changement
Le comportement actuel me semble correct.
> str(as.integer(NULL)[1L])
int NA
> str(as.list(NULL)[1L])
List of 1
$ : NULL
OMI, cela ne devrait pas être NA car :
Je penche pour le point de Jan. Le comportement actuel de l'élément vide est en fait la façon dont une liste représente les manquants (il n'y a aucun objet vers lequel pointer). Nous pourrions construire un exemple où chaque élément de la liste était un vecteur logique, chaque élément étant le résultat d'un calcul. Dans un tel cas, 3 états différents pourraient devoir être représentés : longueur 0 logique, longueur 1 NA logique et calcul manquant. Si la longueur 1 NA logique était utilisée pour les manquants, ces 2 ne pouvaient pas être distingués.
Changer de méthode d'impression suffirait-il ? Au lieu que rien ne soit imprimé, que diriez-vous de NULL
? L'impression de NA
pourrait à nouveau impliquer une longueur 1 NA logique, alors que NULL
serait sans ambiguïté, cohérent avec ce que la base R imprime pour les éléments de liste vides, et donnerait un rappel visuel supplémentaire qu'il s'agissait d'une liste colonne.
également d'accord avec Jan, en particulier sur la longueur 0 --> la longueur 1.
J'utilise beaucoup lengths(x)>0 pour filtrer les lignes par colonnes de liste vides.
nous pourrions, je suppose, y mettre logical() à la place, y a-t-il un avantage de logical() par rapport à NULL?
Et si nous ajoutions simplement une phrase à la documentation en notant le comportement dans le cas d'une colonne de liste manquante :
Entrée actuelle pour l'argument de remplissage :
TRUE remplit les colonnes manquantes avec les NA. Par défaut FAUX. Lorsque TRUE, use.names est défini sur TRUE.
Proposé :
TRUE remplit les colonnes manquantes avec des NA, ou NULL pour les colonnes de liste manquantes. Par défaut FAUX. Lorsque TRUE, use.names est défini sur TRUE.
Le changement de doc semble bon. Plus le changement de méthode d'impression que j'ai suggéré aussi ?
Commentaire le plus utile
Et si nous ajoutions simplement une phrase à la documentation en notant le comportement dans le cas d'une colonne de liste manquante :
Entrée actuelle pour l'argument de remplissage :
Proposé :