要在不显式使用eval
(这通常是不受欢迎的)的情况下做到这一点,请使用do.call
,如以下示例所示:
1) [要使用[.data.table
,请try 以下操作:
library(data.table)
dt <- as.data.table(mtcars)
exp1 <- "cyl == 8 & mpg > 16"
do.call("[", list(dt, str2lang(exp1)))
给
mpg cyl disp hp drat wt qsec vs am gear carb
<num> <num> <num> <num> <num> <num> <num> <num> <num> <num> <num>
1: 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
2: 16.4 8 275.8 180 3.07 4.070 17.40 0 0 3 3
3: 17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 3
4: 19.2 8 400.0 175 3.08 3.845 17.05 0 0 3 2
2) subset使用subset
也可以:
do.call(subset, list(dt, str2lang(exp1)))
3) lm/plot如果目标是随后将子集输入lm
或plot
,则可以通过将3个参数中的每个参数作为传递到do.call
的列表的单独组成部分传递给lm
,从而一次性完成子集和对lm
的调用.同样,我们成功避免了任何明确的eval
电话.(这将仅使用dt
代替quote(dt)
,但Call:行就会混乱.)
do.call("lm", list(mpg ~ ., quote(dt), subset = str2lang(exp1)))
## Call:
## lm(formula = mpg ~ ., data = dt, subset = cyl == 8 & mpg > 16)
...snip...
或与plot
do.call(plot, list(mpg ~ disp, dt, subset = str2lang(exp1)))
4) tidyverse使用tidyverse我们可以使用!!parse_expr(...)
library(dplyr)
library(rlang)
dt %>% filter(!!parse_expr(exp1))