2011-08-04 35 views
5

我有一個問題,即通過命令行從php執行R腳本,我需要給它兩個數組進行計算。通過命令行從PHP傳遞數組到R

我通過運行調用腳本:

Rscript nls.R ??? ??? 

???和?是我需要「給」R的數組,以便它計算某些值。

任何人都知道如何做到這一點?它不僅限於php,因爲它是命令行 - 我只需要知道一個數組是否可以通過命令行傳遞給R以及如何。

R怎麼會抓住它,用什麼命令?

非常感謝。

問候

+1

注意:根據您如何從PHP執行Rscript,如果傳遞的參數來自Web用戶,請注意安全漏洞。 – Spacedman

回答

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 
+0

這樣做的竅門是,因爲數組很小,所以我將它們串聯在一個字符串中,然後在R中對它們進行了重新整理。謝謝大家! – Nemanja

2

你不能這樣的事情(當然,不容易)傳遞給RscriptRscript-e選項,其中可以有多個,即R表達式。因此,您可以讓PHP生成一個字符串,該字符串是創建數組的R表達式,並傳遞每個表達式以通過單獨的-e參數創建一個數組。

您還可以傳遞R功能commandArgs()可以抓取並提供給您的命令行參數。看到一個例子here,但是你可能需要弄清楚參數是如何通過並由R進行評估的。

根據數組的大小,上面這些可能不會有用。在這種情況下,您將不得不查看與R通信的其他方式,而不是通過Rscript

+0

很難將-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保存),你有腳本之前把它們,例如Rscript --no-save myscript.r

4

假設你想在服務的過程運行R.一個網頁,有一些比命令行更好的調用R的方法;問題是R解釋器啓動非常慢,並且你浪費了大量時間和CPU功率來重複啓動它。

例如,您可以製作一個小型R服務器triggr,並使用用PHP套接字製作的客戶端與它交談。
更簡單但更重的想法是製作一個rApache應用程序,並使用CURL與它交談或直接將其作爲AJAX或甚至HTML提供程序使用。