使用Java Servlet / Spring bean中的JRI调用R.

时间:2013-11-04 15:10:34

标签: java r jri

我正在开发一个基于Java的Web应用程序,它需要使用R来执行一些计算。我已经能够正确地安装和配置rJava / JRI了,但我仍然坚持这一点:当我从控制台应用程序调用R时,它总是很好用,但是当我从一个Servlet(或一个Spring bean)调用R时,我试过两个)这个R代码有一个“源('r_script.R')”指令,它只适用于第一次调用;第二个调用在REXP内返回NULL,第三个调用使REngine挂起。这是我的代码:

在Java servlet中:

String rScriptUrl = this.getClass().getClassLoader().getResource("example1.R").getFile();
File rScriptFile = new File(rScriptUrl);
if (!rScriptFile.exists()) {
    System.err.println("R script does not exist!");
    return;
}

System.out.println("Loading REngine...");
Rengine re = new Rengine(new String[]{"--vanilla"}, false, null);
System.out.println("Rengine created, waiting for R");

if (!re.waitForR()) {
    System.out.println("Cannot load R");
    return;
}
System.out.println("R loaded!");

String rScriptPath = rScriptFile.getAbsolutePath();
rScriptPath = rScriptPath.replace("\\", "/");

String expr = String.format("source('%s')", rScriptPath);
re.eval(expr);

REXP result = re.eval("f1(10, 2)");
if (result != null) {
    System.out.println(">>>>>> result from R: " + result.asDouble());
} else {
    System.err.println(">>>>>> result is NULL");
}

re.end();

example1.R包含:

f1 <- function(a, b) {  return(a / b)  }

因此,在Java控制台应用程序中尝试这个确切的示例将始终很好用。 R函数“f1”执行并按预期返回“5”。如果我从servlet调用R但不使用“source('example1.R')”,例如执行re.eval(“2 * 3”),它也运行正常,我得到6.但如果我调用“ source('example1.R')“并运行

REXP result = re.eval("f1(10, 2)");

第一次运行正确返回5,第二次运行(只需按F5)返回NULL,并且3r运行代码挂起

Rengine re = new Rengine(new String[]{"--vanilla"}, false, null);

有人可以对此有所了解吗?有什么想法吗?

非常感谢, 马科斯

0 个答案:

没有答案