将字符串转换为命名函数参数
Turn character strings into named function arguments
我有一个我打算从命令行调用的 R 脚本,其中包含一个可以采用选项 ...
参数的函数。我想将命令行中给出的任何参数解析为 ...
中的参数。我该怎么做?
我试过 rlang 包。我认为这样的事情会奏效:
z <- c('x=1', 'y=2') #but actually, z <- commandArgs(T)
c(UQS(z))
在这里我希望得到一个向量,就像我调用 c(x=1, y=2)
一样。相反,我得到了一个名称列表 x=1
&c.
我没有必要推荐你的方法。使用像 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
形式的东西不能独立存在于表达式之外,否则它会被解释为赋值。如果您只需要使用左侧的名称或右侧的值,可能有更智能的方法来执行此操作,但如果您将其作为一个字符块传递,则需要对其进行解析。
同意之前的回答,这个有点不安全。也就是说,某种程度上 安全地实现这一点的一种 hacky 方法是利用环境。
首先,创建一个空白环境:
args_env <- env()
Parse-eval 你在那个环境中的论点。
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)
我有一个我打算从命令行调用的 R 脚本,其中包含一个可以采用选项 ...
参数的函数。我想将命令行中给出的任何参数解析为 ...
中的参数。我该怎么做?
我试过 rlang 包。我认为这样的事情会奏效:
z <- c('x=1', 'y=2') #but actually, z <- commandArgs(T)
c(UQS(z))
在这里我希望得到一个向量,就像我调用 c(x=1, y=2)
一样。相反,我得到了一个名称列表 x=1
&c.
我没有必要推荐你的方法。使用像 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
形式的东西不能独立存在于表达式之外,否则它会被解释为赋值。如果您只需要使用左侧的名称或右侧的值,可能有更智能的方法来执行此操作,但如果您将其作为一个字符块传递,则需要对其进行解析。
同意之前的回答,这个有点不安全。也就是说,某种程度上 安全地实现这一点的一种 hacky 方法是利用环境。
首先,创建一个空白环境:
args_env <- env()
Parse-eval 你在那个环境中的论点。
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)