我在理解传递的引用属性方面遇到了一些麻烦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) 在" 数据分析软件:使用R编程 "一书中,John Chambers强调通常不应该为其副作用编写函数; 相反,函数应返回一个值而不修改其调用环境中的任何变量.相反,使用data.table对象编写好的脚本应该特别避免使用对象赋值<-,通常用于存储函数的结果.
首先,是一个技术问题.想象一个被调用的R函数proc1,它接受一个data.table对象x作为它的参数(除了,可能还有其他参数).proc1返回NULL但x使用修改:=.根据我的理解,proc1调用只是因为承诺的工作方式而proc1(x=x1)制作副本x1.但是,如下所示,原始对象x1仍然被修改proc1.为什么/这是怎么回事?
> require(data.table)
> x1 <- CJ(1:2, 2:3)
> x1
V1 V2
1: 1 2
2: 1 3
3: 2 2
4: 2 3
> proc1 <- function(x){
+ x[,y:= V1*V2]
+ NULL
+ }
> proc1(x1)
NULL
> x1
V1 V2 y
1: 1 2 2
2: 1 3 3 …Run Code Online (Sandbox Code Playgroud)