将数组作为参数从Perl脚本传递到R脚本

问题描述:

我是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中?现在只有数组的第一个数字被存储和打印,但是我想让矢量中的每一个数字或类似的东西。

在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

如果你这样做在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.

存在的经营者,除非你以某种方式序列化,您无法通过一个完整的数据结构。