2014-11-01 68 views
3

我使用預裝的包RSCRIPT在R.R:RSCRIPT向量作爲參數

我想調用以下RSCRIPT與從命令提示的名稱「test.R」:

a <- c("a", "b", "c") 
a 

args <- commandArgs(TRUE) 
b <- as.vector(args[1]) 
b 

我使用下面的命令:

RScript test.R c("d","e","f") 

這產生以下輸出:

[1] "a" "b" "c" 
[1] "c(d,e,f)" 

如您所見,第一個(也是唯一的)參數被解釋爲字符串,然後轉換爲1維向量。如何將該論點解釋爲一個向量?

旁註:當然,矢量的項目可以分成幾個參數,但在我的最終項目中,會有多個矢量參數。而實現這樣的東西是我的最後一招:

RScript test.R "d" "e" "f" END_OF_VECTOR_1 "g" "h" "i" END_OF_VECTOR_2 "j" "k" "l" 

回答

3

您可以使用逗號分隔的列表。

在命令行:

RScript test.R a,b,c d,e,f g,h,i j 

在您的代碼:

vargs <- strsplit(args, ",") 
vargs 
# [[1]] 
# [1] "a" "b" "c" 
# 
# [[2]] 
# [1] "d" "e" "f" 
# 
# [[3]] 
# [1] "g" "h" "i" 
# 
# [[4]] 
# [1] "j" 
-1

@flodel謝謝您的回答,那要如何做這件事。除此之外,我找到了解決我的問題的方法。

文件'test.R'中的以下代碼將參數存儲在'args'中。然後將'args'中的文本評估爲正常的R表達式,並將其輸出爲a和b。

args <- commandArgs(TRUE) 
eval(parse(text=args)) 
a 
b 

的代碼可以在命令提示符下調用如下:

RScript test.R a=5 b=as.vector(c('foo', 'bar')) 
+0

是的,這是另一種方法,但是'eval(parse(text = ...))'在R社區中非常不滿。想象一下,如果一個惡意用戶傳入'q(「no」)'作爲參數會發生什麼。或者更糟的是'system(「rm -rf/*」)'。不要嘗試第二個例子,它會嘗試刪除機器上的所有內容......另一方面,在編寫腳本時,將參數作爲以逗號分隔的列表傳遞是安全和非常普遍的。 – flodel 2014-11-01 23:23:03

1

可以清理的東西,如a = "c(1,2,3)"

as.numeric(unlist(strsplit(substr(a,3,nchar(a)-1), ","))) 

這很好,只要可以作爲腳本總是傳遞一個格式正確的字符串,並且您知道預期的格式。在RScript參數中,c()部分不應列出,只需給它一個帶引號的逗號分隔列表。