我有一个问题,我正在通过命令行从php执行R脚本,我需要给它两个数组进行计算。
我通过运行来调用脚本:
Rscript nls.R ??? ???
???和???是我的数组,我需要“给”R,以便它计算某些值。
任何人都知道如何做到这一点?它不仅限于php,因为它是命令行 - 我只需要知道数组是否可以通过命令行传递给R以及如何。
R怎么会抓住它,用什么命令?
非常感谢。
此致
答案 0 :(得分: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
答案 1 :(得分:4)
假设你想在服务网页的过程中运行R,有一些比命令行更好的方法来调用R;问题是R解释器启动速度很慢,而且你浪费了大量的时间和CPU能力来反复启动它。
例如,您可以使用triggr创建一个小型R服务器,并使用由PHP套接字构建的客户端与之通信。 更简单但更重的想法是创建一个rApache应用程序,并与CURL对话或直接将其用作AJAX甚至HTML提供程序。
答案 2 :(得分: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
答案 3 :(得分:2)
你不能把这些事情(好吧,不容易)传递给Rscript
。 Rscript
具有-e
选项,其中可以有多个选项,即R表达式。所以你可以让PHP生成一个字符串,它是一个创建数组的R表达式,并传递每个表达式以通过单独的-e
参数创建一个数组。
您还可以传入R函数commandArgs()
可以获取的命令行参数,并为您提供。请参阅示例here,但您可能必须讨论如何传递参数并由R进行评估。
根据数组的大小,上述情况可能不会有用。在这种情况下,您必须查看与R通信的其他方式,而不是通过Rscript
。