通过命令行从php传递数组到R

5

我有一个问题,我需要通过命令行从php执行R脚本,并且需要为计算提供两个数组。

我运行以下命令来调用脚本:

Rscript nls.R ??? ???

我需要将我的数组 ??? 和 ??? 传递给 R,以便它计算某些值。

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

R 会用什么命令捕捉它呢?

非常感谢。

祝好!


1
请注意:根据您如何从PHP执行Rscript,如果传递的参数来自Web用户,请注意安全漏洞。 - Spacedman
4个回答

4
你需要的命令是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 中重新解析。谢谢大家! - Nemanja

4
假设您希望在提供网页的过程中运行R,有一些比命令行更好的调用R的方法;问题是R解释器启动非常慢,您正在浪费大量时间和CPU资源来反复启动它。例如,您可以使用triggr创建一个小型的R服务器,并使用由PHP sockets制作的客户端与其通信。
更简单但更重的想法是创建一个rApache应用程序,并使用CURL与其通信,或者直接将其用作AJAX甚至HTML提供程序。

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


2

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

您还可以传递命令行参数,R函数commandArgs()可以获取并为您提供。在这里查看示例,但您可能需要尝试一下如何通过R进行评估和传递参数。

根据数组的大小,上述方法很可能无法使用。在这种情况下,您将不得不寻找与Rscript通信的其他方式。


使用-e选项与自己的脚本结合使用很困难。设置工作目录并使用-e源脚本并不是那么直接... - Joris Meys

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接