2012-05-29 56 views
2

我們如何從java調用R語言/ R腳本?基本上我需要圍繞R腳本的Java包裝。從java中調用R語言/腳本

  1. 數據將給予的java層說方法使用setData(雙[]),其應反過來發送至R腳本 - 讓我們說setDataR(雙[])方法。

  2. R腳本將執行一些計算說調用方法double [] computeR()。

  3. Java程序將通過調用double [] getData()來獲得計算結果,該函數依次委託給R腳本來獲取計算的數據。

這怎麼能由JRI,Rserv,Rcaller進行?我沒有看到任何方式來調用Rscript方法?請寄樣品。它應該與JNI(java,C++)調用相似。

  1. 在jvm中,我認爲多個線程無法調用R腳本調用正確嗎?任何工作?

感謝

+0

刪除評論。 – nograpes

回答

0

從Java使用R本最簡單的辦法是使用Runtime.exec(""),抓住了響應,並解析它。有關如何運行原生指令的典型例子是:

Process p = Runtime.getRuntime().exec("ls"); 
BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream())); 
BufferedReader stdError = new BufferedReader(new InputStreamReader(p.getErrorStream())); 

從這裏,你可以閱讀和處理打印到標準輸出結果被緩存到stdInput

+0

此操作需要額外的字符串解析過程,該過程已由RCaller處理。 – jbytecode

0

RCaller準確地做你想做的。假設你有一個雙陣列「A」被定義爲

double[] a = new double[] {1.0, 2.0, 3.0}; 

,你要計算的平均數,中位數和標準偏差值。創建一個RCaller的新實例

RCaller caller = new RCaller(); 
Globals.detect_current_rscript(); 
caller.setRscriptExecutable(Globals.Rscript_current); 

RCode code = new RCode(); 


code.addDoubleMatrix("a", a); 
code.addRCode("s <- list(mean=mean(a), median=median(a), sd=sd(a))"); 

caller.setRCode(code); 

caller.runAndReturnResult("s"); 

double mean = caller.getParser().getAsDoubleArray("mean")[0]; 
double median = caller.getParser().getAsDoubleArray("median")[0]; 
double sd = caller.getParser().getAsDoubleArray("sd")[0]; 

並且變量中位數保存從R腳本返回的值2.0。詳情請參閱here