我是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中?现在只存储和打印数组的第一个数字,但我希望将每个数字都放在矢量或类似的东西中。
答案 0 :(得分: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中,您可以使用shift
和pop
。
my @args = @_;
my $output = shift @args;
my $number = pop @args;
# now @args only contains the clusters
我不知道这些运营商是否存在于R。
除非以某种方式对其进行序列化,否则无法传递完整的数据结构。
答案 1 :(得分:0)
在perl中,qx会将字符串作为参数。你当然可以use an array to generate that string,但最终它仍然是一个字符串。你不能传递数组&#34;对于系统调用,您只能传递命令行文本/参数。
请记住,您正在执行将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])
将其另存为&#34; test.r&#34;然后尝试用&#34; Rscript test.r test.txt执行一次~2&#34;并且您将获得以下输出(在Rscript 46084,OpenBSD上测试):
[1] "Filename: test.txt"
[1] "Cluster list: c(\"one\", \"two\")"
[1] "Cluster:"
[[1]]
[1] "one" "two"
[1] "First Item: one"
所以,你必须在perl方面做的就是使用&#34;〜&#34;来加入你的数组。或任何其他分隔符 - 它高度依赖于您的数据,并且您还没有提供它。
摘要:重新思考如何在perl和Rscript之间进行通信。考虑将数据作为分隔字符串发送(如果它的大小合适)并在另一侧分解。查看IPC,如果它不起作用,请考虑环境变量或其他选项。无法在命令行上发送数组引用。