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:
<code>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 </code>
Jeśli jednak wstawię nie:=
oparta na modyfikacji między<-
zadanie i:=
linie powyżejDT
nie jest już modyfikowany:
<code>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 </code>
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ć.