在R脚本中解析命令行参数

54

有没有方便的方法可以自动解析传递给R脚本的命令行参数?

类似于perl中的Getopt::Long


与https://dev59.com/z3I95IYBdhLWcg3wyRI0相关。 - Blaisorblade
5个回答

64

在CRAN上有三个包:

  • getopt: C语言 getopt 命令行选项解析行为
  • optparse: 受 Python 的 optparse 库启发的命令行解析器
  • argparse: 基于 Python 的 argparse 库实现的可选和位置参数解析器。该包需要安装带有 argparsejson(或 simplejson)模块的 Python 解释器。

更新:

  • docopt:只需按照特定格式提供描述信息,即可定义命令行接口。这是一个 docopt.py 的端口。
  • argparser: 使用纯 R 编写的跨平台命令行参数解析器,不依赖任何外部组件。这个包在 Rscript前端下很有用,可以将 R 脚本转换为可执行脚本。
  • minimist: 与 minimist JavaScript 库绑定。该模块实现了 optimist 的参数解析器的核心功能,但没有所有花哨的装饰(没有外部依赖)。
  • optigrab: 使用简单、干净的语法从命令行分析选项。它几乎不需要或者完全不需要指定,并支持短选项和长选项,GNU、Java 或 Microsoft 样式的语法,动词命令等等。

5
由于某种原因,argparse 实际上需要 Python。这使我首先尝试了 optparse... - krlmlr
18
不请求的建议 - 虽然使用出色的Python argparse包很诱人,但跨语言依赖会让你的R脚本变得更加复杂和脆弱。不要这样做。使用上面描述的纯R选项之一。 - Chris Warth
1
此外,似乎在R中使用argparse库会使您的脚本变慢。 - twb10
1
optigrabopt_help()中存在一个[bug][https://github.com/decisionpatterns/optigrab/issues/1],尽管已经提供了PR,但在4年多的时间里仍未得到解决。这使得它对于预期的用途来说相当不可用。 - Keiran Raine

37

最简单的方法是使用commandArgs()函数。示例代码如下,将其保存为“options.R”:

options <- commandArgs(trailingOnly = TRUE)
options

使用“Rscript options.R x y z”运行。结果:

[1] "x" "y" "z"

i.e. 一个包含3个元素的列表,每个元素对应一个参数。


7
这与 getopt 的选项解析不相似。 - Alex Reynolds
4
请注意,我在将近7年前回答了这个问题;现在肯定有更好的方法 :) - neilfws

12

仅仅作为对Rscript答案的补充:

edd@max:~$ r -e 'print(argv)' flim flam flom
[1] "flim" "flam" "flom"
edd@max:~$ 

littler 中,我们只是使用 argv。我使用 getopt 好几次了,这是两个可用解析包中较旧的一个。


6
我可以介绍一下Xmisc包中的ArgumentParser。它是一个命令行解析器,受到Python的argparse启发,但它不需要使用Python。
您可以查看此链接以获取更多信息:http://cran.r-project.org/web/packages/Xmisc/vignettes/Xmisc-ArgumentParser.pdf
以下是相关截图: enter image description here

1

getopt long 是按照 --parameter=argument 的格式进行的。

rscript script.R --parameter1=argument1 --parameter2=argument2

可以仅使用基本字符串包进行解析。

示例

cli.r

library(pracma)
library(stringr)
run.arguments <- commandArgs(TRUE)
valid.run.parameters <- c( "universe", "character", "ability" )
for ( i in 1:length( run.arguments ) ) {
    if ( strcmpi( substr( run.arguments[i], 1, 2 ), "--" ) & grepl( "=", run.arguments[i], fixed = TRUE) ) {
        key.pair <- str_split( run.arguments[i], "=", simplify=TRUE )
        run.parameter <- gsub( "--", "", key.pair[1] )
        run.argument <- key.pair[2]
        if ( run.parameter %in% valid.run.parameters ) {

            # DO YOUR MAGIC HERE! Here is an example...
            cat( run.parameter, "\n" )
            cat( run.argument,  "\n\n" )

        }
    }
}

上述脚本是为了简洁而编写的。请查看更具吸引力的版本

用法

rscript cli.R --universe=MCU --character="Wade Wilson"

输出

universe
MCU

character
Wade Wilson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接