data.table 中的 eval 和 quote

2024-01-10

我在这里缺少什么?

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(使用前将#替换为@)

data.table 中的 eval 和 quote 的相关文章

随机推荐