Ich wusste nicht, dass DT[TRUE]
eine Möglichkeit ist, eine flache Kopie zu erhalten. seichte Kopie war nur für den internen Gebrauch bestimmt. Danke an @renkun-ken für die Hervorhebung in #3214 und verwandten #2254.
In v1.11.8 sehen wir dies:
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
Es tritt erst nach DT[TRUE]
, iiuc, was die Leute hoffentlich nicht entdeckt oder sich zu sehr darauf verlassen haben?! Ich hoffe, die Verwendung da draußen ist wie bei @renkun-ken beschrieben, um der flachen Kopie neue Spalten hinzuzufügen, nicht um vorhandene Spalten zu ändern!
Der neue Test 1542.08 wurde in PR #2313 hinzugefügt, der bereit ist, wenn dies behoben ist.
Ja, setkey, das Ändern vorhandener Spalten sollte bei der flachen Kopie nicht verwendet werden, da die Spalten selbst nicht kopiert werden.
Wenn wir keine flachen Kopien mit dt[TRUE]
zulassen, wird dieses Problem automatisch behoben.
Schließlich. Aber in der Zwischenzeit können wir den Workflow von @renkun-ken nicht unterbrechen.
Mehr Details hier: https://github.com/Rdatatable/data.table/issues/3214#issuecomment -462490046
der folgende Code könnte zu Tests hinzugefügt werden, um das Kopierverhalten sicherzustellen
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)
Hilfreichster Kommentar
Ja, setkey, das Ändern vorhandener Spalten sollte bei der flachen Kopie nicht verwendet werden, da die Spalten selbst nicht kopiert werden.