我有一个在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)
在这种情况下,我得到一个其toString()值为
的REXP [REAL* (7245.0, 6003.0, 5504.0)]
但是如果我然后用
进行eval()调用 summary(array1)
我得到的是null而不是预期的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,所以我很确定问题在于环境而不是代码。我做了几个小时的搜索,还没有找到解决方案。任何帮助都会很棒。
答案 0 :(得分:0)
好吧,所以它确实与本机库及其符号链接有关。当我没有将libjri.so,libR.so和libRblas.so的符号链接到我的java.library.path中时,我的应用程序中出现异常,但是一旦我得到了这些,就不再有例外了。原来我还需要libRlapack.so。一旦我符号链接,我就开始获得预期的REXP值。