[英]Passing an array as an argument from a Perl script to a R script
我是R的新手,我有一個Perl腳本,我想在其中調用R腳本,該腳本會為我計算一些內容(在此情況下不重要)。 我想提供一個輸入文件,一個包含一些數字和一個集群總數的數字作為參數。 medoid.r是我的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中? 現在,僅存儲和打印數組的第一個數字,但是我想將每個數字都存儲在向量中或類似的東西中。
如果您在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中,您可以為此使用shift
和pop
。
my @args = @_;
my $output = shift @args;
my $number = pop @args;
# now @args only contains the clusters
我不知道這些運算符是否存在於R中。
除非以某種方式對其進行序列化,否則無法傳遞完整的數據結構。
在perl中,qx將期望字符串作為參數。 您當然可以使用數組來生成該字符串 ,但是最終它仍然是字符串。 您不能將“數組”傳遞給系統調用,而只能傳遞命令行文本/參數。
請記住,您正在執行將Rscript作為子進程運行的系統調用。 您描述問題的方式是,除了命令行之外,沒有進程間通信。 這樣想:您將如何在命令行上鍵入數組? 您可能有一些文本表示數組的方法,但是您不能在命令行上鍵入數組。 數組在內存中的存儲方式和訪問方式因各種不同的語言而異 ,因此不能像您建議的那樣在兩種語言之間真正地移植。
一個解決方案:綜上所述,您可能會找到一個簡單的解決方案。 您尚未提供有關要在數組中傳遞的數據類型的任何信息。 如果足夠簡單,則可以嘗試在命令行中將其作為定界文本傳遞,然后將其分解以在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 test.txt one〜two”執行它,您將獲得以下輸出(在Rscript 46084,OpenBSD上測試):
[1] "Filename: test.txt"
[1] "Cluster list: c(\"one\", \"two\")"
[1] "Cluster:"
[[1]]
[1] "one" "two"
[1] "First Item: one"
因此,您需要在perl方面做的就是使用“〜”或任何其他定界符對join()數組進行操作-它高度依賴於數據,而您尚未提供它。
簡介:重新考慮如何在Perl和Rscript之間進行通信。 考慮將數據作為定界字符串(如果大小合適)發送,並在另一端將其分解。 查看IPC是否可行,請考慮環境變量或其他選項。 無法在命令行上發送數組引用。
注意:您可能需要閱讀perl中不同系統調用的安全風險 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.