我有一个在 Tomcat6 上运行的 Java servlet,它使用 JRI (rJava) 与安装在 Amazon linux 服务器上的 R 进行通信。我从源代码安装了 R,通过 cran 安装了 rJava,并为 Tomcat 设置了 R_HOME 和我的类路径。我必须在我的 java.library.path 目录之一中设置一些符号链接到必要的本机库(libjri.so、libR.so 和 libRblas.so),因为我无法配置 java.library.path 以包含这些目录他们安装在其中,但我认为这不是问题。当我跑
./run rtest
从 $R_HOME/library/rJava/jri/ 中的命令行,我得到了预期的输出,并且 REngine 类似乎通过 eval() 生成了 R 语句。但是当我从我的类中调用 eval() 时,几乎在所有情况下都会返回一个 null 而不是 REXP 对象。无论是否打开 DEBUG,都不会记录错误。我得到 REXP 返回的唯一情况是当我设置一个数组时,例如
array1=c(7245.0, 6003.0, 5504.0)
在这种情况下,我得到一个 REXP,其 toString() 值为
[REAL* (7245.0, 6003.0, 5504.0)]
但是,如果我随后使用 eval() 调用
summary(array1)
我得到一个空值而不是预期的 REXP。在我的 Mac 上运行的代码是:
private REXP multipleRegression(Datalist list) {
String fitStr = "fit <- lm(";
for (int i = 0; i < list.size(); i++) {
Datastream ds = list.get(i);
String dsStr = ds.getId() + "=" + ds.toArrayString();
System.out.println("VALUE: " + this.eval(dsStr));
System.out.println("SUMMARY: " + this.eval("summary(" + ds.getId() + ")"));
fitStr += ds.getId();
if (i == 0)
fitStr += " ~ ";
else if (i == list.size() - 1)
fitStr += ")";
else
fitStr += " + ";
}
if (list.size() == 1) {
fitStr += "1)";
}
this.eval(fitStr);
return this.eval("summary(fit)");
}
同样,这适用于我的 Mac,所以我很确定问题出在环境而不是代码上。我进行了几个小时的搜索,但尚未找到解决方案。任何帮助都会很棒。