JRI REngine eval()方法始终返回null

时间:2012-08-03 06:02:44

标签: linux r amazon-ec2 tomcat6 jri

我有一个在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,所以我很确定问题在于环境而不是代码。我做了几个小时的搜索,还没有找到解决方案。任何帮助都会很棒。

1 个答案:

答案 0 :(得分:0)

好吧,所以它确实与本机库及其符号链接有关。当我没有将libjri.so,libR.so和libRblas.so的符号链接到我的java.library.path中时,我的应用程序中出现异常,但是一旦我得到了这些,就不再有例外了。原来我还需要libRlapack.so。一旦我符号链接,我就开始获得预期的REXP值。