: = (передача по ссылке) в пакете data.table одновременно изменяет другой объект таблицы данных - PullRequest
27 голосов
/ 07 ноября 2011

Во время тестирования моего кода я обнаружил следующее: если я назначу data.table DT1 на DT и впоследствии изменим DT, DT1 изменится вместе с ним. Так что DT и DT1 кажутся внутренне связанными. Это намеренное поведение? Хотя я не эксперт по программированию, мне это кажется неправильным, и, тестируя его с помощью простых переменных R или data.frame, я не смог воспроизвести поведение. Что здесь происходит?

DF <- data.frame(ID=letters[1:5],
                  value=1:5)
DF1 <- DF
all.equal(DF1, DF)
[1] TRUE
DF[1, "value"] <- DF[1, "value"]*2
all.equal(DF1, DF)
[1] "Component 2: Mean relative difference: 1"

library(data.table)
data.table 1.7.1  For help type: help("data.table")
DT <- data.table(ID=letters[1:5],
                  value=1:5)
DT1 <- DT
all.equal(DT1, DT)
[1] TRUE
DT[, value:=value*2]
     ID value
[1,]  a     2
[2,]  b     4
[3,]  c     6
[4,]  d     8
[5,]  e    10
all.equal(DT1, DT)
[1] TRUE

1 Ответ

25 голосов
/ 07 ноября 2011

Этот фрагмент документации в data.table поможет.? data.table::copy

Значение не возвращается.Таблица data.table изменена ссылкой.Если вам требуется копия, сначала сделайте копию (используя DT2 = copy (DT)).Функция copy () также иногда может быть полезна перед: = используется для суб-присвоения столбцу по ссылке.

...