【发布时间】:2014-05-28 11:10:55
【问题描述】:
作为一个最小的工作示例,例如,我希望能够动态地将表达式传递给 data.table 对象以创建新列或修改现有列:
dt <- data.table(x = 1, y = 2)
dynamicDT <- function(...) {
dt[, list(...)]
}
dynamicDT(z = x + y)
我期待:
z
1: 3
但是,我得到了错误:
Error in eval(expr, envir, enclos) : object 'x' not found
那么我该如何解决这个问题?
尝试:
我见过this post,它建议使用quote 或substitute,但是
> dynamicDT(z = quote(x + y))
Error in `rownames<-`(`*tmp*`, value = paste(format(rn, right = TRUE), :
length of 'dimnames' [1] not equal to array extent
或
> dynamicDT <- function(...) {
+ dt[, list(substitute(...))]
+ }
> dynamicDT(z = x + y)
Error in prettyNum(.Internal(format(x, trim, digits, nsmall, width, 3L, :
first argument must be atomic
对我没用。
【问题讨论】:
-
如果您使用
list,您将无法获得所需的输出。如果你的函数可以工作,输出将是z 1: 3。你需要使用:= -
@DavidArenburg。感谢您指出这一点 - 是写作时的疏忽。现已修复。
-
我其实为你原来想要的输出写了一个答案,你还需要吗
-
当然 - 谢谢大卫。调整最终输出应该不会太难。重要的是您如何设法传递要在 data.table 上下文中评估的表达式,而不是
.GlobalEnv。 -
查看我对多个变量的编辑
标签: r data.table