У меня есть сервлет 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, поэтому я почти уверен, что проблема в среде, а не в коде. Я провел несколько часов поиска и еще не нашел решения. Любая помощь будет замечательной.