r语言 - 意外修改的函数输入(数据表)



在将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()][]
}

最新更新