2016-11-17 129 views
0

我是R新手,我有一個Perl腳本,我想在其中調用一個R腳本,該腳本爲我計算某些內容(在此上下文中並不重要) )。我想給出一個輸入文件的參數,一個數組包含一些數字和一個總數的簇數。 medoid.r是我的R Script的名字。將數組作爲參數從Perl腳本傳遞到R腳本

my $R_out; 
    $R_out = qx{./script/medoid.r $output @cluster $NUMBER_OF_CLUSTERS} 

我目前的R代碼看起來像這樣。現在我只是打印羣集來查看裏面的內容。

args <- commandArgs(TRUE) 
    filename = args[1] 
    cluster = as.vector(args[2]) 
    number_of_cluster = args[3] 

    matrix = read.table(filename, sep='\t', header=TRUE, row.names=1, quote="") 
    print(cluster) 

是否可以給一個數組作爲參數?我如何將它保存在R中?現在只有數組的第一個數字被存儲和打印,但是我想讓矢量中的每一個數字或類似的東西。

回答

0

在Perl中,qx將期望一個字符串作爲參數。你當然可以use an array to generate that string,但最終它仍然是一個字符串。您不能「傳遞數組」到系統調用中,只能傳遞命令行文本/參數。

請記住,您正在執行系統調用,將Rscript作爲子進程運行。您描述問題的方式,除命令行之外,不存在進程間通信。想想這樣:型號如何在命令行中使用數組?你可能有一些表示數組的文本方式,但是你不能在命令行上輸入類型的數組。 Arrays are stored and accessed in memory differently by various different languages,因此在您建議的兩種語言之間並不是真正可移植的。

一個解決方案:所有的說法,可能會有一個簡單的解決方案給你。您尚未提供有關您想要在陣列中傳遞的數據類型的任何信息。如果它足夠簡單,您可以嘗試將它作爲分隔文本傳遞到命令行,然後將其分解爲在Rscript中使用。

這裏是一個RSCRIPT,顯示你明白我的意思:

args = commandArgs(trailingOnly=TRUE) 
filename = args[1] 
cluster <- c(strsplit(args[2],"~")) 

sprintf("Filename: %s",filename) 
sprintf("Cluster list: %s",cluster) 

print("Cluster:") 
cluster 

sprintf("First Item: %s",cluster[[1]][1]) 

另存爲「test.r」,並嘗試用「RSCRIPT test.r測試執行它。TXT一個〜二」,你會得到下面的輸出(46084 RSCRIPT測試,OpenBSD的):

[1] "Filename: test.txt" 
[1] "Cluster list: c(\"one\", \"two\")" 
[1] "Cluster:" 
[[1]] 
[1] "one" "two" 

[1] "First Item: one" 

所以,你不得不對事物的perl的一側做的是加入()的陣列使用「〜」或任何其他delimiter-它是高度依賴於你的數據,你沒有提供它

總結:重新思考要如何Perl和RSCRIPT之間的通信考慮發送數據作爲一個分隔符的字符串(如果它是合適的大小)並在另一端分解它,查看IPC是否不起作用,考慮環境變量或其他選項,沒有辦法在命令行上發送數組引用,線。

注意:你可能想要閱讀security risks of different system calls in perl

1

如果你這樣做在Perl

$R_out = qx{./script/medoid.r $output @cluster $NUMBER_OF_CLUSTERS}; 

你的命令行看起來類似於此

./scriptmedoid.r output 111 222 333 3 

假設$output'output'@clusters = (111, 222, 333)

如果你想讀的,在R,你需要的所有元素在args第一個cluster但最後一個,最後一個number_of_cluster後分配。在Perl中,你可以使用shiftpop

my @args = @_; 
my $output = shift @args; 
my $number = pop @args; 
# now @args only contains the clusters 

我不知道,如果在R.

存在的經營者,除非你以某種方式序列化,您無法通過一個完整的數據結構。