函数输入 (data.table) 意外修改

Function input (data.table) unexpectedly modified

我在一个以 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 或获取 DTest 的维度时,我得到 4 列,但 RStudio 上的环境 window 为 DTest 声明了 2 个变量,并正确地为 a.

声明了 4 个变量
dim(DTest)
[1] 10  4

data.table版本:1.12.8

请注意,我创建了一个类似的函数,但使用 data.frame 作为输入,一切都按预期进行。

这里有一个方法可以避免这种行为:

test <- function(DT) {
  ODT <- copy(DT)
  ODT[,var0:=rnorm(.N,0,1)]
  ODT[,var1:=numeric()][]
}