用data.table准报价

JBG*_*ber 2 r data.table rlang quasiquotes

我试图将我的头缠在准引号上,以便可以与data.table电话一起使用。这是一个例子:

library(data.table)
library(rlang)
dt <- data.table(col1 = 1:10, col2 = 11:20)

dt[, col1]
Run Code Online (Sandbox Code Playgroud)

如果我想将其包装到函数中,该怎么做?我试过了:

foo <- function(dt, col) {
  col <- quo(col)

  expr(dt[, !!col1])
}

foo(dt, col1)
Run Code Online (Sandbox Code Playgroud)

但是得到Error in enexpr(expr) : object 'col1' not found。我认为我缺少一些步骤,因此data.table对的评价与有所不同dplyr

MrF*_*ick 5

您想使用以下方式将列名称捕获为符号

col <- ensym(col)
Run Code Online (Sandbox Code Playgroud)

而不是quo()然后使用

expr(dt[, !!col])
Run Code Online (Sandbox Code Playgroud)

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

eval_tidy(expr(dt[, !!col]))
Run Code Online (Sandbox Code Playgroud)

但实际上,准符号化的东西在tidyverse中效果最好,而不是与data.table函数本身兼容。“ data.table”方式可能更像是这个现有问题:使用variable在data.table中传递列名。data.table非常喜欢字符串而不是符号。