我有一个简单的DT,我想在其余部分添加一列。代码如下:(有效)
x <- data.table(a=1:5,b=5:1,c=rep(999,5))
for(k in c("a","b")){x[,k] <- x[,..k]+x[,.(c)]}
现在是一个问题:为什么我必须使用..
进行分配?另外,如果我在第一种情况下尝试使用..
,即
for(k in c("a","b")){x[,..k] <- x[,..k]+x[,.(c)]}
存在错误:“未找到[...]对象'..k'”。看起来很奇怪,我必须在范围内更改语法。
现在在dataframe
中,等效公式非常清楚:
for(k in c("a","b")){x[,k] <- x[,k]+x[,c]} # error with DT
x <- data.frame(a=1:5,b=5:1,c=rep(999,5))
for(k in c("a","b")){x[,k] <- x[,k]+x[,"c"]} # works with dataframe
所以我想知道(1)上面的代码是否是在datatable
中执行此操作的正确方法(请解释一下..
运算符,数据表FAQ 1.1并未特别针对此问题) ;如果是(2),则可以使用其他更简洁的方式编写。感谢您的提示。
答案 0 :(得分:1)
来自官方introducion(针对您的示例进行了稍微编辑):
对于熟悉Unix终端的人,..前缀应为 让人联想到“上一级”命令,类似于 这是怎么回事– ..信号发送到data.table以查找 k个变量“上一级”,即在循环环境中 在这种情况下。
因此,此运算符转义数据帧,并在更高级别中查找k变量,获取该值并返回。不知道为什么会这样,但是可能变量没有被传输。
您还可以使用with参数:
x[,k,with=FALSE]
编辑:
我刚刚检查了data.table的源代码。它们从parent.frame()
获取被调用的变量,因此调用了获取函数的环境。这是由..
或with
参数触发的。因此,如果您不使用它,该函数将无法获取环境的参数。
发现关于parent.frame()
的问题here