从java调用R语言/脚本

时间:2012-05-29 14:29:50

标签: java r rserve jri rcaller

我们如何从java调用R语言/ R脚本?基本上我需要围绕R脚本的java类包装器。

  1. 数据将提供给java层说方法setData(double []),它应该依次发送给R脚本 - 让我们说setDataR(double [])方法。

  2. R脚本将执行一些计算,称调用方法double [] computeR()。

  3. Java程序将通过调用double [] getData()获取计算结果,而double [] getData()依次委托R脚本获取计算数据。

  4. 如何通过JRI,Rserv,Rcaller执行此操作?我没有看到任何调用Rscript方法的方法?请发送样品。它应该与JNI(java,C ++)调用类似。

    1. 在jvm中我认为多个线程无法调用R脚本调用正确吗?有什么解决方法吗?
    2. 由于

2 个答案:

答案 0 :(得分: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的标准输出的结果。

答案 1 :(得分: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];

并且变量median保存从R脚本返回的值2.0。有关详细信息,请访问页面here