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

时间:2016-11-17 17:45:49

标签: arrays r perl vector arguments

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

2 个答案:

答案 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中,您可以使用shiftpop

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,如果它不起作用,请考虑环境变量或其他选项。无法在命令行上发送数组引用。

注意:您可能需要阅读security risks of different system calls in perl