将字符串转换为命名函数参数

时间:2018-02-20 21:44:03

标签: r rlang non-standard-evaluation

我打算从命令行调用一个R脚本,其中包含一个可以选择...个参数的函数。我想解析命令行中给出的任何参数作为...中的参数。我怎么能这样做?

我尝试过rlang包。我觉得这样的事情会奏效:

z <- c('x=1', 'y=2') #but actually, z <- commandArgs(T)
c(UQS(z))

在这里,我希望得到一个向量,好像我已经调用了c(x=1, y=2)。相反,我得到了一个名单x=1&amp; c。

的列表

2 个答案:

答案 0 :(得分:4)

我同意之前的回答,这有点不安全。也就是说,安全地实现有点的一种方法是利用环境。

首先,创建一个空白环境:

args_env <- env()

在该环境中解析您的参数。

z <- c("x=1", "y=2")
eval(parse(text = z), envir = args_env)

将环境转换为列表:

args_list <- as.list(args_env)

现在,您应该可以使用do.call来传递参数。

do.call(f, args_list)

答案 1 :(得分:0)

我不需要推荐你的方法。使用像optparse这样的包来正确解析命令行参数会更安全。

但是,如果您想将任意字符串视为R代码,则只需eval(parse(test=))即可。如果你真的想使用rlang,可以使用eval_tidy/parse_expr

args <- c('x=1', 'y=2')
z <- eval_tidy(parse_expr(paste0("c(", paste(args, collapse=","), ")")))
# or
z <- eval(parse(text=paste0("c(", paste(args, collapse=","), ")")))

您需要这样做,因为a=b形式的内容不能独立存在于表达式之外,否则会被解释为赋值。如果您只需要使用左侧的名称或右侧的值,可能会有更明智的方法来执行此操作,但如果将其作为一个字符块传递,则需要解析它。