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ć.

questionAnswers(2)

yourAnswerToTheQuestion