2012-12-09 60 views
3

我試圖通過命令行將多個文件路徑參數傳遞給Rscript,然後可以使用參數解析器處理該Rscript。最後,我想是這樣的在R中通過命令行傳遞多個參數

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

您可以詳細說明爲什麼@ agstudy的解決方案不起作用?這是相當準確 –

+0

此外,可能重複http://stackoverflow.com/questions/2151212/how-can-i-read-command-line-parameters-from-an-r-script –

+1

@RicardoSaporta它不重複。它有點不同。 – agstudy

回答

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 

人們可能會認爲這種瑣碎特徵將b中提及,將支持多個參數Ë實現到廣泛使用的包裝,如optparse

乾杯

+1

爲什麼不解釋你如何使用optparse包? – agstudy

+0

這超出了我的問題範圍。 Optparse示例可在此處的文檔中找到http://cran.r-project.org/web/packages/optparse/optparse.pdf – by0

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" 
+0

這不適合我。我的論點要複雜得多。大約有8-10個選項可以通過。因此,arg解析器 – by0

+0

@Omar複雜嗎?怎麼樣?你可以舉個例子嗎? – agstudy

+0

當然,我在我的問題中增加了一個例子。如果文件是我作爲參數傳入的唯一文件,那麼您的解決方案只適用於我。沒有? – by0

5

雖然它不是CRAN釋放時,這個問題被問argparse模塊的測試版是在那裏,現在可以做到這一點。它基本上是一個相同名稱的流行python模塊的包裝,因此您需要安裝最新版本的python才能使用它。請參閱安裝說明以獲取更多信息基本的例子包括總結一個任意長的數字列表,這些數字不應該很難修改,所以你可以抓取一個任意長的輸入文件列表。

> install.packages("argparse") 
> library("argparse") 
> example("ArgumentParser") 
0

@如果輸入參數是相同長度的列表,agstudy的解決方案無法正常工作。默認情況下,sapply會將相同長度的輸入合併到一個矩陣中,而不是列表中。該修復非常簡單,只需在sapply解析參數時明確地將簡化設置爲false即可。

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) 
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,"[,:]")