假设我有以下 data.table
并希望通过引用存储在向量中的变量来获取以下输出:
dt <- data.table(a = rep(1, 3),
b = rep(2, 3))
x <- 'a'
y <- 'b'
dt[, .(sum(get(x)), mean(get(y)))]
V1 V2
1: 3 2
很酷,它有效。但现在我想做一个函数,然后做类似的事情:
foo <- function(arg1, arg2) {
dt[, .(sum(get(arg1)), mean(get(arg2)))]
}
foo(x, y)
意识到它的工作原理,我想避免调用所有这些 gets
,并执行如下操作:
foo <- function(arg1, arg2) {
eval(substitute(dt[, .(sum(arg1), mean(arg2))]))
}
foo(x, y) # or foo('x', 'y')
但这失败了。关于如何以类似于多次调用 get
的方式一次评估所有参数的任何想法?
最佳答案
我们可以转换为sym
用 as.symbol
填充或 as.name
和 eval
时间
foo <- function(arg1, arg2) {
dt[, .(sum(eval(as.name(arg1))), mean(eval(as.name(arg2))))]
}
foo(x, y)
# V1 V2
#1: 3 2
或使用 [[
对 data.table 的列进行子集化
foo <- function(arg1, arg2) {
dt[, .(sum(.SD[[arg1]]), mean(.SD[[arg2]]))]
}
foo(x, y)
# V1 V2
#1: 3 2
或者另一种选择是 paste
和 eval/parse
foo <- function(arg1, arg2) {
eval(parse(text = paste0("dt[, .(sum(", arg1, "), mean(", arg2, "))]")))
}
foo(x, y)
# V1 V2
#1: 3 2
关于r - 替代 (m)get in data.table 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60366128/