我在这里缺少什么?
d = data.table(a = 1:5)
d[, a] # 1 2 3 4 5
d[, sum(a)] # 15
d[, eval(quote(a))] # 1 2 3 4 5
d[, sum(eval(quote(a)))] # 15
quoted_a = quote(a)
d[, eval(quoted_a)] # 1 2 3 4 5
d[, sum(eval(quoted_a))] # Error in eval(expr, envir, enclos) : object 'a' not found
到底是怎么回事?我在跑R 2.15.0
and data.table 1.8.9
.
更新(eddi): As of 这已被修复并且.SD
在可以就地计算表达式的情况下不需要,例如在 OP 中。由于目前存在.SD
触发完整的构建.SD
,在某些情况下这将导致更快的速度。
发生的事情是调用eval()
在实现的代码中处理方式与您可能想象的不同[.data.table()
。具体来说,[.data.table()
包含特殊评估分支i
and j
以符号开头的表达式eval
。当您将呼叫转接至eval
在通话中sum()
, eval
不再是解析/替换表达式的第一个元素,并且跳过特殊评估分支。
这是通过键入显示的怪物函数中的代码位getAnywhere("[.data.table")
这为拨打电话提供了特殊津贴eval()
传入via[.data.table()
's j
-争论:
jsub = substitute(j)
...
# Skipping some lines
...
jsubl = as.list.default(jsub)
if (identical(jsubl[[1L]], quote(eval))) { # The test for eval 'on the outside'
jsub = eval(jsubl[[2L]], parent.frame(), parent.frame())
if (is.expression(jsub))
jsub = jsub[[1L]]
}
作为解决方法,请遵循 data.table FAQ 1.6 中的示例(pdf here http://datatable.r-forge.r-project.org/datatable-faq.pdf),或明确指出eval()
向.SD
,保存您正在操作的任何 data.table 的列的局部变量(此处d
)。 (有关更多解释.SD
的作用,见前几段这个答案 https://stackoverflow.com/questions/15667984/can-sd-be-viewed-from-a-browser-within-data-table/15668311#15668311).
d[, sum(eval(quoted_a, envir=.SD))]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)