Data.table: DT[TRUE] peut conduire à une clé invalide

Créé le 13 déc. 2018  ·  4Commentaires  ·  Source: Rdatatable/data.table

Je ne savais pas que DT[TRUE] était un moyen d'obtenir une copie superficielle. copie superficielle était uniquement destinée à un usage interne. Merci à @renkun-ken pour l'avoir souligné dans #3214 et #2254 connexe.

  • [x] #3214
  • [ ] #2254

En v1.11.8 on voit ceci :

DT = data.table(id = 1:5, key="id")
DT1 = DT[TRUE]
key(DT1)
[1] "id"
DT1[3, id:=6L]
key(DT1)
# NULL              # correct
DT$id
# [1] 1 2 6 4 5     # should be 1:5
key(DT)
# [1] "id"          # invalid key

Cela ne se produit qu'après DT[TRUE] , iiuc, que, espérons-le, les gens n'ont pas trop découvert ou utilisé ? ! J'espère que l'utilisation est similaire à celle décrite par @renkun-ken pour ajouter de nouvelles colonnes à la copie superficielle, et non pour modifier les colonnes existantes !

Le nouveau test 1542.08 a été ajouté dans le PR #2313, prêt pour une fois ce problème corrigé.

bug

Commentaire le plus utile

Oui, setkey, la modification des colonnes existantes ne doit pas être utilisée sur la copie superficielle car les colonnes elles-mêmes ne sont pas copiées.

Tous les 4 commentaires

Oui, setkey, la modification des colonnes existantes ne doit pas être utilisée sur la copie superficielle car les colonnes elles-mêmes ne sont pas copiées.

Si nous n'autorisons pas la copie superficielle avec dt[TRUE] ce problème sera automatiquement résolu.

Finalement. Mais en attendant, nous ne pouvons pas casser le workflow de @renkun-ken.
Plus de détails ici : https://github.com/Rdatatable/data.table/issues/3214#issuecomment -462490046

le code suivant pourrait être ajouté aux tests pour garantir le comportement de copie

DT = data.table(a=c(1,2), b=c("b","a"))
address(DT)
address(DT[])
address(DT[, .SD])
address(DT[TRUE])
sapply(DT, address)
sapply(DT[], address)
sapply(DT[, .SD], address)
sapply(DT[TRUE], address)
Cette page vous a été utile?
0 / 5 - 0 notes