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

Flo*_*Flo 3 naming r

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


例如,我想执行以下命令:

subset(mtcars, select=c(disp:drat, vs:gear))   
Run Code Online (Sandbox Code Playgroud)

但是将内容分配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'
Run Code Online (Sandbox Code Playgroud)

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


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

avi*_*seR 5

c()在表达式中错过了,并且您还需要eval在表达式中subset

library(rlang)

x <- parse_expr("c(cyl:drat, vs:gear)")
subset(mtcars, select=eval(x))
Run Code Online (Sandbox Code Playgroud)

parse_expr相当于parse在基数 R 中:

x2 = parse(text="c(cyl:drat, vs:gear)")
subset(mtcars, select=eval(x2))
Run Code Online (Sandbox Code Playgroud)

您还可以使用parse_exprparse_exprsselectfrom一起使用dplyr,这是打算使用它的地方:

library(dplyr)

select(mtcars, !! x)
Run Code Online (Sandbox Code Playgroud)

或用于拼接表达式列表:

y = parse_exprs("cyl:drat; vs:gear")
select(mtcars, !!! y)
Run Code Online (Sandbox Code Playgroud)