2014-10-02 62 views
2

輸入我有下列R-腳本(myscript.r如何使[R腳本從管道和用戶給定參數

#!/usr/bin/env Rscript 
dat <- read.table(file('stdin'), sep=" ",header=FALSE) 
# do something with dat 
# later with user given "param_1" 

隨着該腳本,我們可以運行它通過以下方式;

$ cat data_no_*.txt | ./myscript.r 

我想要做的是使腳本需要額外的參數來自用戶:

$ cat data_no_*.txt | ./myscript.r param_1 

我應該怎麼做修改myscript.r,以適應?

回答

2

對於非常基本的用法,看看?commandArgs

對於更復雜的用法,用於命令行參數和選項解析的兩個流行包爲getoptoptparse。我一直使用它們,他們完成了工作。我也看到argparse,argparserGetoptLong,但從未使用過。我錯過了一個:德克建議你看看docopt這看起來非常好,易於使用。

最後,由於您似乎在通過管道傳遞參數,因此您可能會發現這個OpenRead()函數有助於推廣代碼並允許您的參數成爲管道或文件。


我想測試docopt所以把他們放在一起,你的腳本可能會是這樣的:

#!/usr/bin/env Rscript 

## Command-line parsing ## 

'usage: my_prog.R [-v -m <msg>] <param> <file_arg> 

options: 
-v  verbose 
-m <msg> Message' -> doc 

library(docopt) 
opts <- docopt(doc) 

if (opts$v) print(str(opts)) 
if (!is.null(opts$message)) cat("MESSAGE: ", opts$m) 

## File Read ## 

OpenRead <- function(arg) { 
    if (arg %in% c("-", "/dev/stdin")) { 
     file("stdin", open = "r") 
    } else if (grepl("^/dev/fd/", arg)) { 
     fifo(arg, open = "r") 
    } else { 
     file(arg, open = "r") 
    } 
} 

dat.con <- OpenRead(opts$file_arg) 
dat <- read.table(dat.con, sep = " ", header = FALSE) 

# do something with dat and opts$param 

而且你可以試運行:

echo "1 2 3" | ./test.R -v -m HI param_1 - 

./test.R -v -m HI param_1 some_file.txt 
+0

你真的*想看看我s更聰明[dococt](http://cran.r-project.org/package=doctopt)軟件包---但是,你仍然需要一個程序來讀取它們,而'r'敲擊'Rscript'在我的書中... – 2014-10-02 02:02:03

+0

固定鏈接:[docopt](http://cran.r-project.org/web/packages/docopt/index.html)。確實很有趣,主要來自易用性。但一眼看去,我覺得它沒有那麼多的花裏胡哨。 – flodel 2014-10-02 02:12:20

+0

感謝您接收錯字。經過多年的getopt(以及相關的C/C++庫)後,我開始使用docu。 – 2014-10-02 02:13:51

2

我們通過r可執行文件構建littler來支持該功能。

看看它的例子,它可能適合你的賬單。

相關問題