从java中调用R语言/脚本

问题描述:

我们如何从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

从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

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