我在理解传递的引用属性方面遇到了一些麻烦data.table.有些操作似乎"打破"了参考,我想准确理解发生了什么.
在data.table从另一个创建a 时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
Run Code Online (Sandbox Code Playgroud)
但是,如果我:=在<-赋值和:=上面的行之间插入非基础修改,DT现在不再修改:
DT = data.table(a=c(1,2), b=c(11,12))
newDT …Run Code Online (Sandbox Code Playgroud) 我已将a的名称存储data.table为vector:
library(data.table)
set.seed(42)
DT <- data.table(x = runif(100), y = runif(100))
names1 <- names(DT)
Run Code Online (Sandbox Code Playgroud)
据我所知,这是一个普通的香草字符向量:
str(names1)
# chr [1:2] "x" "y"
class(names1)
# [1] "character"
dput(names1)
# c("x", "y")
Run Code Online (Sandbox Code Playgroud)
但是,这不是普通的字符向量.这是一个神奇的角色矢量!当我向我添加一个新列时data.table,此向量会更新!
DT[ , z := runif(100)]
names1
# [1] "x" "y" "z"
Run Code Online (Sandbox Code Playgroud)
我知道这与如何:=通过作业进行更新有关,但这对我来说仍然是神奇的,因为我希望<-能够复制这些data.table名字.
我可以通过将名称包装在c():
library(data.table)
set.seed(42)
DT <- data.table(x = runif(100), y = runif(100))
names1 <- names(DT)
names2 <- c(names(DT))
all.equal(names1, names2)
# [1] TRUE …Run Code Online (Sandbox Code Playgroud)