Точное понимание того, когда data.table является ссылкой на (по сравнению с копией )другой data.table

У меня возникли небольшие проблемы с пониманием свойств ссылки -по -data.table. Некоторые операции, кажется, «ломают» ссылку, и я хотел бы точно понять, что происходит.

При создании data.tableиз другогоdata.table(с помощью <-, а затем обновлении новой таблицы с помощью :=, исходная таблица также изменяется. Это ожидается в соответствии с:

?data.table::copy и stackoverflow :передать -по -ссылке -оператору --в -таблице -данных --пакет

Вот пример:

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

Однако, если я вставлю модификацию, не основанную на -:=, между назначением <-и строками :=выше,DTбольше не модифицируется:

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

Таким образом, кажется, что строка newDT$b[2] <- 200каким-то образом "ломает" ссылку. Я предполагаю, что это каким-то образом вызывает копию, но я хотел бы полностью понять, как R обрабатывает эти операции, чтобы убедиться, что я не добавлю потенциальных ошибок в свой код.

Буду очень признателен, если кто-нибудь объяснит мне это.

181
задан smci 28 May 2018 в 23:43
поделиться