У меня возникли проблемы с пониманием свойств pass-by-reference data.table
. Некоторые операции, похоже, "ломают" ссылку, и я хотел бы точно понять, что происходит.
При создании data.table
из другого data.table
(через <-
, а затем обновив новую таблицу на :=
, также изменится исходная таблица. Ожидается, что:
?data.table::copy
и qaru.site/info/43347/...
Вот пример:
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 обрабатывает эти операции, чтобы я не вводил потенциальные ошибки в свой код.
Я был бы очень признателен, если бы кто-нибудь мог мне это объяснить.