如评论中所提到的,dplyr动词的下划线版本现已被弃用。正确的方法是使用准引用。
要解决您在select
方面的问题,您只需要修改select_expr
以包含多个表达式:
## I renamed your variables to *_str because they are, well, strings.
filter_str <- "am == 1"
mutate_str <- "gear_carb = gear*carb"
select_str <- "mpg; cyl" # Note the ;
使用
rlang::parse_expr
将这些字符串转换为未求值的表达式:
filter_expr <- rlang::parse_expr( filter_str )
mutate_expr <- rlang::parse_expr( mutate_str )
select_expr <- rlang::parse_exprs( select_str )
有了未评估的表达式,我们现在可以将它们传递给 dplyr
动词。写成 filter( filter_expr )
是行不通的,因为 filter
会在您的数据框中查找名为 filter_expr
的列。相反,我们想要访问存储在 filter_expr
中的表达式。为此,我们使用 !!
运算符,让 dplyr
动词知道参数应该扩展为其内容(即我们感兴趣的未评估的表达式):
mtcars %>% filter( !!filter_expr )
mtcars %>% mutate( !!mutate_expr )
在select
的情况下,我们有多个表达式,这些由!!!
进行处理:
mtcars %>% select( !!!select_expr )
值得一提的是,select
直接与字符串向量配合使用,无需先使用 rlang::parse_expr()
:
mtcars %>% select( c("mpg", "cyl") )