将字符串转换为函数的非字符串输入
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_expr
或 parse_exprs
与 dplyr
中的 select
一起使用,这是它的预期用途:
library(dplyr)
select(mtcars, !! x)
或者拼接一个表达式列表:
y = parse_exprs("cyl:drat; vs:gear")
select(mtcars, !!! y)
如何存储字符串(例如,列范围 "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_expr
或 parse_exprs
与 dplyr
中的 select
一起使用,这是它的预期用途:
library(dplyr)
select(mtcars, !! x)
或者拼接一个表达式列表:
y = parse_exprs("cyl:drat; vs:gear")
select(mtcars, !!! y)