Метод JRI REngine eval() всегда возвращает null

У меня есть сервлет Java, работающий на Tomcat6, который использует JRI (rJava) для связи с R, установленным на сервере Amazon Linux. Я установил R из исходного кода, установил rJava через кран и установил R_HOME и свой путь к классам для Tomcat. Мне пришлось настроить несколько символических ссылок в одном из моих каталогов java.library.path на необходимые собственные библиотеки (libjri.so, libR.so и libRblas.so), потому что я не мог настроить java.library.path для включения каталогов. что они установили, но я не думаю, что это проблема. Когда я бегу

    ./run rtest

из командной строки в $R_HOME/library/rJava/jri/ я получаю ожидаемый результат, и класс REngine, похоже, делает операторы R через eval() в порядке. Но когда я вызываю 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, поэтому я почти уверен, что проблема в среде, а не в коде. Я провел несколько часов поиска и еще не нашел решения. Любая помощь будет замечательной.


person Mike Harkins    schedule 03.08.2012    source источник


Ответы (1)


Итак, это связано с нативными библиотеками и их символическими ссылками. У меня были исключения в моем приложении, когда я не получил символические ссылки для libjri.so, libR.so и libRblas.so в свой java.library.path, но как только я их получил, больше никаких исключений. Оказалось, что мне нужен еще и libRlapack.so. Как только я сделал символическую ссылку, я начал получать ожидаемые значения REXP.

person Mike Harkins    schedule 19.08.2012