我试图通过命令行将多个文件路径参数传递给Rscript,然后可以使用参数解析器进行处理。最终我会想要这样的东西
Rscript test.R --inputfiles fileA.txt fileB.txt fileC.txt --printvar yes --size 10 --anotheroption helloworld -- etc...
通过命令行传递,并在解析时将结果作为R中的数组
args$inputfiles = "fileA.txt", "fileB.txt", "fileC.txt"
我尝试了几种解析器,包括optparse和getopt,但它们似乎都不支持这种功能。我知道argparse确实如此,但它目前不适用于R版本2.15.2
有什么想法吗?
由于
答案 0 :(得分:5)
虽然在提出这个问题时CRAN上没有发布它,但argparse模块的测试版现在可以实现。它基本上是一个相同名称的流行python模块的包装器,因此您需要安装最新版本的python才能使用它。有关详细信息,请参阅安装说明基本示例包括一个任意长的数字列表,这些数字应该不难修改,因此您可以获取任意长的输入文件列表。
> install.packages("argparse")
> library("argparse")
> example("ArgumentParser")
答案 1 :(得分:4)
在脚本test.R的前面,你把它放在:
args <- commandArgs(trailingOnly = TRUE)
hh <- paste(unlist(args),collapse=' ')
listoptions <- unlist(strsplit(hh,'--'))[-1]
options.args <- sapply(listoptions,function(x){
unlist(strsplit(x, ' '))[-1]
})
options.names <- sapply(listoptions,function(x){
option <- unlist(strsplit(x, ' '))[1]
})
names(options.args) <- unlist(options.names)
print(options.args)
得到:
$inputfiles
[1] "fileA.txt" "fileB.txt" "fileC.txt"
$printvar
[1] "yes"
$size
[1] "10"
$anotheroption
[1] "helloworld"
答案 2 :(得分:0)
在搜索并避免自下而上编写新包之后,我认为使用包optparse输入多个参数的最佳方法是将输入文件与一个字符分开,该字符很可能被包含在一个字符中。文件名(例如冒号)
Rscript test.R --inputfiles fileA.txt:fileB.txt:fileC.txt etc...
文件名也可以在其中包含空格,只要空格被转义(optparse会处理这个)
Rscript test.R --inputfiles file\ A.txt:file\ B.txt:fileC.txt etc...
Ultimatley,如果有一个软件包(可能是optparse的修改版本)可以支持多个参数,如问题及下面提到的那样
Rscript test.R --inputfiles fileA.txt fileB.txt fileC.txt
人们会认为这些微不足道的功能将被实现到一个广泛使用的包中,例如optparse
干杯
答案 3 :(得分:0)
args <- commandArgs(trailingOnly = TRUE)
hh <- paste(unlist(args),collapse=' ')
listoptions <- unlist(strsplit(hh,'--'))[-1]
options.args <- sapply(listoptions,function(x){
unlist(strsplit(x, ' '))[-1]
}, simplify=FALSE)
options.names <- sapply(listoptions,function(x){
option <- unlist(strsplit(x, ' '))[1]
})
names(options.args) <- unlist(options.names)
print(options.args)
答案 4 :(得分:0)
您描述命令行选项的方式与大多数人期望使用它们的方式不同。通常,命令行选项将采用单个参数,而没有先前选项的参数将作为参数传递。如果一个参数需要多个项目(比如文件列表),我建议使用strsplit()解析字符串。
以下是使用optparse的示例:
library (optparse)
option_list <- list ( make_option (c("-f","--filelist"),default="blah.txt",
help="comma separated list of files (default %default)")
)
parser <-OptionParser(option_list=option_list)
arguments <- parse_args (parser, positional_arguments=TRUE)
opt <- arguments$options
args <- arguments$args
myfilelist <- strsplit(opt$filelist, ",")
print (myfilelist)
print (args)
以下是几个示例运行:
$ Rscript blah.r -h
Usage: blah.r [options]
Options:
-f FILELIST, --filelist=FILELIST
comma separated list of files (default blah.txt)
-h, --help
Show this help message and exit
$ Rscript blah.r -f hello.txt
[[1]]
[1] "hello.txt"
character(0)
$ Rscript blah.r -f hello.txt world.txt
[[1]]
[1] "hello.txt"
[1] "world.txt"
$ Rscript blah.r -f hello.txt,world.txt another_argument and_another
[[1]]
[1] "hello.txt" "world.txt"
[1] "another_argument" "and_another"
$ Rscript blah.r an_argument -f hello.txt,world.txt,blah another_argument and_another
[[1]]
[1] "hello.txt" "world.txt" "blah"
[1] "an_argument" "another_argument" "and_another"
请注意,对于strsplit,您可以使用正则表达式来确定分隔符。我会建议类似下面的内容,它可以让你用逗号或冒号分隔你的列表:
myfilelist <- strsplit (opt$filelist,"[,:]")