【问题标题】:Passing an array from php via command line to R通过命令行将数组从php传递到R
【发布时间】:2011-10-20 02:01:04
【问题描述】:

我有一个问题,我正在通过命令行从 php 执行一个 R 脚本,我需要给它两个数组进行计算。

我通过运行调用脚本:

Rscript nls.R ??? ???

???和 ???是我需要“给”给 R 的数组,以便它计算某些值。

有人知道怎么做吗?它不仅限于 php,因为它是命令行 - 我只需要知道一个数组是否可以通过命令行传递给 R 以及如何传递。

R 将如何捕获它,使用什么命令?

非常感谢。

问候

【问题讨论】:

  • 注意:根据您从 PHP 执行 Rscript 的方式,如果传递的参数来自网络用户,请注意安全漏洞。

标签: php r command-line-arguments


【解决方案1】:

您要查找的命令是commandArgs()

现在,如果你有一个列表,如果整数在字符串中用逗号分隔,你可以得到整数

s = '1,2,3,4,5'
your_list = lapply(strsplit(s, ','), as.numeric)[[1]]

可能有更直接的方法来实现这一点。

编辑:

更好的例子(应该也适用于 Rscript)

$ R "1,2,3,4,5"
...

>lapply(strsplit(commandArgs()[[2]], ','), as.numeric)[[1]]
[1] 1 2 3 4 5

【讨论】:

  • 这可以解决问题,因为数组很小,所以我将它们连接成一个字符串,然后在 R 中重新解析它们。谢谢大家!
【解决方案2】:

你不能将这些东西(嗯,不容易)传递给RscriptRscript-e 选项,其中可以有多个,即 R 表达式。因此,您可以让 PHP 生成一个字符串,该字符串是一个创建数组的 R 表达式,并通过单独的 -e 参数传递每个表达式以创建一个数组。

您还可以传入 R 函数 commandArgs() 可以获取并为您提供的命令行参数。请参阅示例 here,但您可能需要考虑如何传入参数并由 R 评估。

根据数组的大小,以上很可能不会有用。在这种情况下,您将不得不考虑通过 Rscript 以外的其他方式与 R 通信。

【讨论】:

  • 很难将 -e 选项与您自己的脚本结合使用。使用 -e 设置工作目录并获取脚本并不是那么简单......
【解决方案3】:

您必须调整您的 R 脚本并包含对 commandArgs() 的调用。当与选项trailingOnly=TRUE 一起使用时,它将在调用后返回一个带有空格分隔参数的字符向量。这将允许您进一步操纵参数。

给定一个脚本 myscript.r:

#My script
x <- commandArgs(trailingOnly=TRUE)
print(x)
print(str(x))

您可以从命令行调用Rscript myscript.r 1 2 3并获取

Loading required package: ...
...
[1] "1" "2" "3"
 chr[1:3] "1" "2" "3"
NULL

F:\Temp

这使您可以将带有数组的文本文件的名称传递给 Rscript。如果我结合不同的语言,我通常会使用文本文件来保存中间结果,这样会更顺利一些。

注意,如果您使用 Rscript 的任何选项(例如 --no-save),您必须将它们放在脚本之前,例如 Rscript --no-save myscript.r

【讨论】:

    【解决方案4】:

    假设您想在提供网页的过程中运行 R,有一些比命令行更好的调用 R 的方法;问题是 R 解释器启动速度非常慢,你正在浪费大量时间和 CPU 资源来一遍又一遍地启动它。

    例如,您可以使用triggr 创建一个小型 R 服务器,并使用使用 PHP 套接字创建的客户端与其通信。
    更简单但更繁重的想法是制作一个rApache 应用程序,然后使用 CURL 与它通信,或者直接将其用作 AJAX 甚至 HTML 提供程序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-23
      • 2013-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-27
      • 2018-01-11
      • 1970-01-01
      相关资源
      最近更新 更多