我正在开发一个基于 Java 的 Web 应用程序,它需要使用 R 来执行一些计算。我已经能够正确安装和配置 rJava/JRI,但我被困在这一点上:当我从控制台应用程序调用 R 时,它总是运行良好,但是当我从 Servlet(或 Spring bean 调用 R ,我都试过了)并且这个R代码有一个“source('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);
任何人都可以对此有所了解吗?有任何想法吗?
非常感谢,马科斯