如何存储字符串(例如,列范围"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应该采用什么格式的提示已经是一个受欢迎的开始。
您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_expr或parse_exprs与selectfrom一起使用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)