2

我正在开发一个基于 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);

任何人都可以对此有所了解吗?有任何想法吗?

非常感谢,马科斯

4

0 回答 0