簡體   English   中英

將數組作為參數從Perl腳本傳遞到R腳本

[英]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中,您可以為此使用shiftpop

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM