1

我有一个打算从命令行调用的 R 脚本,其中包括一个可以采用选项...参数的函数。我想将命令行中给出的任何参数解析为.... 我该怎么做?

我试过 rlang 包。我认为这样的事情会起作用:

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

在这里,我希望得到一个向量,就好像我调用了c(x=1, y=2). 相反,我得到一个名称列表x=1&c。

4

2 回答 2

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)
于 2018-02-20T22:06:18.513 回答
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不能独立存在于表达式之外,否则它会被解释为赋值。如果您只需要使用左侧的名称或右侧的值,可能会有更聪明的方法来执行此操作,但如果您将其作为一个字符块传递,则需要对其进行解析。

于 2018-02-20T21:58:04.623 回答