将数组作为参数从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是否不起作用,考虑环境变量或其他选项,没有办法在命令行上发送数组引用,线。
如果你这样做在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.
存在的经营者,除非你以某种方式序列化,您无法通过一个完整的数据结构。