Вызов R из Java с использованием JRI, как привести возвращаемое значение

Я выполняю некоторые команды R из Java с помощью JRI. Я хочу использовать результаты R в моей Java для дальнейших вычислений, но я понятия не имею, как преобразовать возвращенный объект.

код вызова в Java:

REXP x;
System.out.println(x = rengine.eval("source(\"/..../TS.R\")"));
System.out.println( x.asVector().elementAt(0));

последняя строка из кода R:

eq_all[length(eq_all)-1]

--

вывод в консоль Java:

[VECTOR ([REAL* (3.050462038715372)], [BOOLi* ])]
[REAL* (3.050462038715372)]

«3.050462038715372» — правильное значение, но как я могу получить к нему доступ в Java?

С уважением, Иммануил

PS. связанный вопрос без ответа: Преобразование объекта REXP в двойной массив (Java /Р)


person user1032624    schedule 06.11.2011    source источник


Ответы (2)


Я считаю, что asDouble() и < href="http://www.rosuda.org/r/nightly/javadoc/org/rosuda/JRI/REXP.html#asDoubleArray()" rel="nofollow">asDoubleArray() — это то, что вам нужно.

Обновление: Итак, в вашем примере кода это должно быть:

REXP x;
System.out.println(x = rengine.eval("source(\"/..../TS.R\")"));
System.out.println(x.asVector().elementAt(0).asDouble());

PS. На упомянутый вопрос действительно был ответ, который вам нужен, - проблема с реализацией toString() в массивах Java.

person alf    schedule 06.11.2011
comment
Спасибо за вклад, но я уже пробовал это ' System.out.println(x.asDouble()); System.out.println(x.asDoubleArray());' дает мне «0.0» и «ноль» - person user1032624; 06.11.2011
comment
У меня нет "source(\"/..../TS.R\")", поэтому я не могу проверить ваш код. Не могли бы вы дать sscce.org, пожалуйста? - person alf; 06.11.2011
comment
x.asDouble()) не будет работать, так как x не является скаляром. Смотрите обновление. - person alf; 06.11.2011
comment
Мне нужно подумать еще раз, sscce не так прост из-за зависимостей. У меня есть ощущение, что мой тип данных R может быть проблемой. - person user1032624; 06.11.2011
comment
Сначала проверьте обновление; может быть, у вас еще нет проблем :) - person alf; 06.11.2011
comment
Разобрался :D. Запуск кода R с использованием "source(...)" был проблемой, он возвращает "[VECTOR ([REAL* (3.050462038715372)], [BOOLi* ])]" вместо "[REAL* (3.050462038715372)]". Отдельный вызов для получения результатов (с использованием вашего ответа) решил проблему. Спасибо за помощь!!! - person user1032624; 07.11.2011

elementAt() не работает, вы можете использовать at().

REXP x;
System.out.println(x = rengine.eval("source(\"/..../TS.R\")"));
System.out.println(x.asVector().at(0).asDouble());
person LoveTW    schedule 29.07.2014