用(点)参数解析一个字符串

时间:2014-01-29 20:16:42

标签: r cran

有没有办法将带有参数的字符串解析为语言对象列表?例如:

> query <- "mpg, cyl, hp:vs"
> eval(parse(text=paste0("dplyr:::dots(", query, ")")))
[[1]]
mpg

[[2]]
cyl

[[3]]
hp:vs

但这很难看,会导致代码注入等。有没有办法分别解析query部分而不将其注入R代码?我真的想使用本机解析器并避免使用字符串操作手动修改代码,因为参数本身可以包含代码或逗号。例如:

query2 <- "foo, 'flip,flop', function(x){print('foo', x)}"
eval(parse(text=paste0("dplyr:::dots(", query2, ")")))

应该产生:

[[1]]
foo

[[2]]
[1] "flip,flop"

[[3]]
function(x) {
    print("foo", x)
}

1 个答案:

答案 0 :(得分:3)

# First, create a string that represents a function call
string <- paste0("c(", query, ")")

# Next, parse it, and extract the function call
call <- parse(text = string)[[1]]

# Finally, remove the first element (`c`) and
# convert to a list
as.list(call[-1])

没有评估代码,因此您应该安全地避免代码注入。 (当然,parse

中可能存在缓冲区溢出错误