将字符串转换为函数的非字符串输入

Convert string to non-string input for function

如何存储字符串(例如,列范围 "cyl:drat, vs:gear")以便我可以在函数中使用它 而不是 被解释为字符字符串?


例如我想执行以下命令:

subset(mtcars, select=c(disp:drat, vs:gear))   

但是将 select 的内容分配给变量 x

x <- as.name("cyl:drat, vs:gear")
subset(mtcars, select=x)
#Error in x[j] : invalid subscript type 'symbol'

library(rlang)
x <- quo(!! sym("cyl:drat, vs:gear"))
subset(mtcars, select=x)
#Error in x[j] : invalid subscript type 'language'

x <- parse_expr("cyl:drat, vs:gear")
subset(mtcars, select=x)
#Error in x[j] : invalid subscript type 'language'

分配 x <-"cyl" 有效,但 x <-"cyl:drat" 同样失败。


关于 x 应该采用何种格式的提示已经是一个受欢迎的开始。

你的表达式中漏掉了c(),你还需要eval你的表达式里面subset:

library(rlang)

x <- parse_expr("c(cyl:drat, vs:gear)")
subset(mtcars, select=eval(x))

parse_expr 等同于 parse 在基础 R:

x2 = parse(text="c(cyl:drat, vs:gear)")
subset(mtcars, select=eval(x2))

您还可以将 parse_exprparse_exprsdplyr 中的 select 一起使用,这是它的预期用途:

library(dplyr)

select(mtcars, !! x)

或者拼接一个表达式列表:

y = parse_exprs("cyl:drat; vs:gear")
select(mtcars, !!! y)