首页 > 解决方案 > 对 data.table 使用 i 中变量的字符串表示

问题描述

显然我太愚蠢了,无法输入正确的搜索词,b/c 我认为我的问题根本不是唯一的。

i部分中如何通过字符串引用变量data.tablewith并且..x都对这个j部分有好处,但是这个部分的等价物是i什么?我必须使用邪恶吗eval(双关语;)

library(data.table)
dt <- data.table(x = 1:4, y = 4:1)

my_filter_fun <- function(var = names(dt)) {
  var <- match.arg(var)
  dt[eval(parse(text = paste(var, "== 1")))]
}
my_filter_fun("x")
my_filter_fun("y")

这样做的惯用方式是data.table什么?来自dplyr我想我正在寻找相当于 quosures 的data.table?

额外的问题:我怎么能实现my_filter_fun这样的调用

my_filter_fun(x > 1)

将返回相同的结果

dt[x > 1]

标签: rdata.table

解决方案


对于您的第一个问题,我建议使用get()来避免以下问题eval()

my_filter_fun <- function(var = names(dt)) {
  var <- match.arg(var)
  dt[get(var) == 1]
}
my_filter_fun("x")
   x y
1: 1 4

对于奖金问题,您可以执行以下操作。它可能可以简化 - 只是我不知道如何。

bonus_filter_fun <- function(filter) {
  filter <- deparse(substitute(filter))
  dt[eval(parse(text = filter))]
}
bonus_filter_fun(x > 1)
   x y
1: 2 3
2: 3 2
3: 4 1

推荐阅读