2011-01-26 131 views
9

我很難將一個文件名傳遞給我的R腳本。該文件是一個csv文件,其中包含用於腳本多次運行的批處理參數。我試圖在這裏包含它,以便用戶不需要編輯R腳本來指定該文件的位置。R命令行將參數傳遞給腳本(Windows)

我的Windows命令行語法是:

R CMD BATCH --slave "--args fn=batch.csv" myscript.r output.txt 

我得到在我的[R腳本檢索此最接近的是這樣做的:

eval(parse(file=commandArgs()[8]))) 
batch_args = read.table(fn, sep=",") 

我已經試驗了commandArgs(trailingOnly=TRUE)parse(text=commandArgs()[8])等沒有運氣。我所見過的大多數文檔都不適用於傳遞文件名。任何人都可以想出解決方案嗎?

+0

我會建議使用的`Rscript`代替的r CMD BATCH`。你使用什麼版本的R? – 2011-01-26 18:29:06

+0

使用R 2.12.0。我可以使用相同的語法使用Rscript? – Benjamin 2011-01-26 18:30:28

+0

不,語法不同。比較`?Rscript`和`?BATCH`。 – 2011-01-26 18:31:43

回答

17

正如我在我的評論說,我會用Rscript代替R CMD BATCH

Rscript myscript.R batch.csv 

其中myscript.R包含:

args <- commandArgs(TRUE) 
batch_args <- read.table(args[1], sep=",") 
# loop over multiple runs 
6

你是什麼意思'沒有運氣'?文件名在那裏,在commandArgs()函數中,你只需要弄清楚如何解決問題。代碼和錯誤消息很方便。

如果唯一的額外參數是文件名,那麼這不是問題,您知道它的位置。當你開始傳遞更復雜的論證時,會讓你困惑的是什麼。

你也通過傳遞'fn = foo.csv'使事情複雜化。只需傳遞文件名並將其分配給腳本中的fn即可。如果你真的想使用eval你可能需要引用您的文件名,從而myscript.r是:

ca = commandArgs(trailingOnly=TRUE) 
eval(parse(text=ca)) 
print(read.csv(fn)) 

,因此運行:

R --slave "--args fn='batch.csv'" < myscript.r 
    A B C 
    1 1 2 3 
    2 6 8 3 

凡batch.csv是一個簡單的CSV文件。

您可以在腳本中對「ca」進行循環並評估所有內容。儘管這很危險,因爲你很容易破壞基本的功能。

就我個人而言,我會遍歷ca,爲已知的一組名稱查找name = value對,並設置它們。基本上實現getopt的,但有人可能做到這一點已經...

+0

幾乎可以工作,但在嘗試執行read.table時會中斷,因爲「batch.csv」不會被識別爲正確的文件名,而會被識別爲字符串。我雖然給它的完整路徑可能會有幫助,但隨後因空間而斷裂。目前,我從所有文件所在的目錄(.r,.txt和.csv)運行它。 – Benjamin 2011-01-26 18:41:27

7

除了使用Rscript(如Josh說的),您還應該使用CRAN軟件包getoptoptparse,因爲它們是爲了這個目的而編寫的。

2

嘗試

fn="batch.csv"; R CMD BATCH --slave "--args $fn" myscript.r output.txt 
相關問題