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

时间:2010-08-08 08:25:32

标签: parsing r command-line-arguments

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

类似于perl的Getopt::Long

5 个答案:

答案 0 :(得分:42)

CRAN上有三个包:

  • getopt:C-like getopt behavior
  • optparse:受Python的 optparse 库启发的命令行解析器
  • argparse:命令行可选和位置参数解析器(受Python的 argparse 库启发)。此程序包要求使用argparsejson(或simplejson)模块安装Python解释器。

<强>更新

  • docopt:允许您通过为其指定特定格式的描述来定义命令行界面。这是一个docopt.py
  • 的端口
  • argparser:纯粹在R中编写的跨平台命令行参数解析器,没有外部依赖关系。这个包对Rscript前端非常有用,有助于将R脚本转换为可执行脚本。
  • minimist:对最小化JavaScript库的绑定。这个模块实现了乐观主义者的参数解析器的胆量而没有所有的幻想装饰(没有外部依赖)
  • optigrab:使用简单,干净的语法从命令行解析选项。它几乎不需要任何规范,支持短期和长期选项,GNU,Java或Microsoft风格的语法,动词命令等。

答案 1 :(得分:28)

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

options <- commandArgs(trailingOnly = TRUE)
options

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

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

一个包含3个元素的列表,每个参数一个。

答案 2 :(得分:11)

只是为了补充Rscript答案:

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

我们只在littler中使用argv。我很幸运getopt,这是两个可用解析包中较旧的一个。

答案 3 :(得分:5)

我可以在Xmisc包中介绍ArgumentParser吗?它是一个受Python argparse启发的命令行解析器,但它不含Python。

http://cran.r-project.org/web/packages/Xmisc/vignettes/Xmisc-ArgumentParser.pdf

enter image description here

答案 4 :(得分:0)

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" )

        }
    }
}

以上脚本是为了简洁而编写的。请参阅more compelling version

用法

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

输出

universe
MCU

character
Wade Wilson