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.
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é.
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)
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.