У меня возникли небольшие проблемы с пониманием свойств ссылки -по -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 обрабатывает эти операции, чтобы убедиться, что я не добавлю потенциальных ошибок в свой код.
Буду очень признателен, если кто-нибудь объяснит мне это.