r - 替代 (m)get in data.table 函数

标签 r data.table

假设我有以下 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 的方式一次评估所有参数的任何想法?

最佳答案

我们可以转换为symas.symbol 填充或 as.nameeval时间

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

或者另一种选择是 pasteeval/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/

相关文章:

在一行中用零替换初始 NA 值,直到非 NA 列

使用apache箭头读取一个R数据帧中的分区 Parquet 目录(所有文件)

r - 如何计算包含字符串的最大值?

R组选择以data.table中的值为条件

r - 按组列列表的平均值

r - 在R上安装curl和readr

r - 如何在我的 ggplot 热图中获取标签?

r - 在 R 中缩放 data.table 列的子集

r - 在包函数中使用 data.table 失败

r - 在 R 中,自定义由 dcast.data.table 创建的列的名称