在将data.table作为输入的函数内创建新列时,我遇到了一个非常意外的行为:该函数意外地更改了输入data.table。举一个简单的例子:
DTest<-data.table(v1=rnorm(10,0,1),v2=rnorm(10,0,1))
test<-function(DT){
DT[,var0:=rnorm(.N,0,1)]
DT[,var1:=numeric()]
return(DT)
}
DTest
v1 v2
1: 0.004911561 0.3054059
2: 0.370564395 0.8336796
3: 0.860755880 0.1052963
4: 1.252397542 -0.0401276
5: 0.372725388 1.0474662
6: -0.090960500 1.2666136
7: -1.457178835 -0.6966777
8: 0.195528018 -0.4050465
9: -0.131193864 -0.8281367
10: -0.769164801 0.3034279
a<-test(DTest)
DTest
v1 v2 var0 var1
1: 0.004911561 0.3054059 0.48903710 NA
2: 0.370564395 0.8336796 -0.06011728 NA
3: 0.860755880 0.1052963 -0.46971666 NA
4: 1.252397542 -0.0401276 -0.63927446 NA
5: 0.372725388 1.0474662 -0.48513926 NA
6: -0.090960500 1.2666136 -1.38466919 NA
7: -1.457178835 -0.6966777 0.17275922 NA
8: 0.195528018 -0.4050465 -1.13829455 NA
9: -0.131193864 -0.8281367 0.50847027 NA
10: -0.769164801 0.3034279 0.65679337 NA
a
v1 v2 var0 var1
1: 0.004911561 0.3054059 0.48903710 NA
2: 0.370564395 0.8336796 -0.06011728 NA
3: 0.860755880 0.1052963 -0.46971666 NA
4: 1.252397542 -0.0401276 -0.63927446 NA
5: 0.372725388 1.0474662 -0.48513926 NA
6: -0.090960500 1.2666136 -1.38466919 NA
7: -1.457178835 -0.6966777 0.17275922 NA
8: 0.195528018 -0.4050465 -1.13829455 NA
9: -0.131193864 -0.8281367 0.50847027 NA
10: -0.769164801 0.3034279 0.65679337 NA
该函数不应更改输入 DTest,不是吗?如果应该,我该如何避免它?有趣的是,尽管当我查看 DTest 或获取 DTests 的维度时,我得到 4 列,但 RStudio 上的环境窗口为 DTests 状态 2 个变量,并正确状态为 4 个变量。
dim(DTest)
[1] 10 4
数据表版本:1.12.8
请注意,我已经创建了一个类似的函数,但使用 data.frame 作为输入,一切都按预期进行。
以下是避免这种行为的一种方法:
test <- function(DT) {
ODT <- copy(DT)
ODT[,var0:=rnorm(.N,0,1)]
ODT[,var1:=numeric()][]
}