2

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

4

1 回答 1

0

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

于 2012-08-19T05:59:25.097 回答