Zrozumienie dokładnie, kiedy data.table jest odwołaniem do (vs kopii) innej tabeli danych
Mam trochę problemów ze zrozumieniem właściwości „pass-by-reference”data.table
. Niektóre operacje wydają się „przerywać” odniesienie i chciałbym dokładnie zrozumieć, co się dzieje.
Podczas tworzeniadata.table
od drugiegodata.table
(przez<-
, a następnie zaktualizowanie nowej tabeli o:=
, oryginalna tabela jest również zmieniona. Oczekuje się tego, zgodnie z:
?data.table::copy
istackoverflow: pass-by-reference-the-operator-in-the-data-table-package
Oto przykład:
library(data.table)
DT <- data.table(a=c(1,2), b=c(11,12))
print(DT)
# a b
# [1,] 1 11
# [2,] 2 12
newDT <- DT # reference, not copy
newDT[1, a := 100] # modify new DT
print(DT) # DT is modified too.
# a b
# [1,] 100 11
# [2,] 2 12
Jeśli jednak wstawię nie:=
oparta na modyfikacji między<-
zadanie i:=
linie powyżejDT
nie jest już modyfikowany:
DT = data.table(a=c(1,2), b=c(11,12))
newDT <- DT
newDT$b[2] <- 200 # new operation
newDT[1, a := 100]
print(DT)
# a b
# [1,] 1 11
# [2,] 2 12
Wygląda więc na to, żenewDT$b[2] <- 200
linia jakoś „łamie” odniesienie. Zgaduję, że to w jakiś sposób wywołuje kopię, ale chciałbym w pełni zrozumieć, w jaki sposób R traktuje te operacje, aby upewnić się, że nie wprowadzę potencjalnych błędów do mojego kodu.
Byłbym bardzo wdzięczny, gdyby ktoś mógł mi to wyjaśnić.