【问题标题】:Passing an array as an argument from a Perl script to a R script将数组作为参数从 Perl 脚本传递到 R 脚本
【发布时间】:2017-04-01 09:30:06
【问题描述】:

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

【问题讨论】:

    标签: arrays r perl vector arguments


    【解决方案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中是否存在这些运算符。

    除非以某种方式将其序列化,否则无法传递完整的数据结构。

    【讨论】:

      【解决方案2】:

      在 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 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 方面,您所要做的就是使用“~”或任何其他分隔符加入()您的数组 - 它高度依赖于您的数据,而您还没有提供它。

      总结:重新考虑一下您希望如何在 perl 和 Rscript 之间进行通信。考虑将数据作为分隔字符串发送(如果大小合适)并在另一侧将其拆分。如果这不起作用,请查看 IPC,考虑环境变量或其他选项。无法在命令行上发送数组引用。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-15
        • 1970-01-01
        • 2016-12-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-27
        相关资源
        最近更新 更多