我试图围绕准报价进行思考,以便我可以将其与data.table
调用一起使用。下面是一个示例:
library(data.table)
library(rlang)
dt <- data.table(col1 = 1:10, col2 = 11:20)
dt[, col1]
如果我想将其包装到函数中,我将如何做到这一点?我试过了:
foo <- function(dt, col) {
col <- quo(col)
expr(dt[, !!col1])
}
foo(dt, col1)
但是得到Error in enexpr(expr) : object 'col1' not found
.我假设我错过了一些步骤,因为data.table
对此的评估方式与dplyr
不同.
您希望将列名捕获为符号
col <- ensym(col)
而不是quo()
然后使用
expr(dt[, !!col])
(不是那里不存在的col1
(,但这只会返回一个表达式。如果你想评估它,你需要
eval_tidy(expr(dt[, !!col]))
但实际上,准符号的东西在整洁中效果最好,而不是原生的 data.table 函数。"data.table"的方式可能更像是这个现有问题中的东西:使用变量在data.table中传递列名。data.table非常喜欢字符串而不是符号。
您可以使用deparse
和substitute
并使用参数with=FALSE
,如下所示:
foo <- function(dt, col){
col_str = deparse(substitute(col))
dt[, col_str, with = F]
}
或者您可以使用eval
和substitute
并使用默认的 data.table 参数with=TRUE
如 :
foo <- function(dt, col){
col_symb = substitute(col)
dt[, eval(col_symb)] # by default: with=TRUE
}
在这两种情况下,substitute
都将获取传递给参数col
的参数的名称。在第一种情况下,deparse
会将这个名称转换为字符串,从而使我们能够使用 with = FALSE 从 data.table 中选择它。在第二种情况下,我们在 data.table 的上下文中计算(使用eval
(参数的名称。