用data.table准报价

时间:2019-10-21 15:14:51

标签: r data.table rlang quasiquotes

我正在尝试把半角引号引起来,以便可以与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.tabledplyr的评估方式有所不同。

2 个答案:

答案 0 :(得分:5)

您要使用

将列名捕获为符号

col <- ensym(col)

而不是quo(),然后使用

expr(dt[, !!col])

(不是在那里不存在的col1),但是只会返回一个表达式。如果要对其进行评估,则需要

eval_tidy(expr(dt[, !!col]))

但实际上,准符号化的东西在tidyverse中效果最好,而不是与data.table函数本身兼容。 “ data.table”方式可能更像是以下现有问题:Pass column name in data.table using variable。 data.table非常喜欢字符串而不是符号。

答案 1 :(得分:1)

您可以使用deparsesubstitute并使用参数with=FALSE,如:

foo <- function(dt, col){
  col_str = deparse(substitute(col))
  dt[, col_str, with = F]
}

或者您可以使用evalsubstitute并使用默认的data.table参数with=TRUE,如:

foo <- function(dt, col){
  col_symb = substitute(col)
  dt[, eval(col_symb)] # by default: with=TRUE
}

在两种情况下,substitute都会获取您传递给参数col的参数的 name 。在第一种情况下,deparse将此名称转换为字符串,从而使我们能够使用with = FALSE从data.table中选择它。在第二种情况下,我们在data.table上下文中评估(使用eval)参数的名称