#r #pass-by-reference #data.table
#r #передача по ссылке #data.table
Вопрос:
Во время тестирования своего кода я обнаружил следующее: если я назначу data.table DT1
для DT
и DT
впоследствии изменю, DT1
это изменится вместе с ним. Так что DT
и DT1
, похоже, внутренне связаны. Является ли это намеренным поведением? Хотя я не специалист по программированию, мне это кажется неправильным, и, тестируя это с помощью простых переменных R или a 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:
Эта часть документации в data.table
помогла бы. ? data.table::copy
Значение не возвращается. Data.table изменяется по ссылке. Если вам требуется копия, сначала сделайте копию (используя DT2=copy(DT)). copy() также иногда может быть полезен, прежде чем := используется для присвоения столбца по ссылке.