Вызов языка / скрипта R из java

Как мы вызываем R language / R script из java? В основном мне нужна java-оболочка для R-скрипта.

  1. Данные будут переданы на уровень Java, например, метод setData (double []), который, в свою очередь, должен отправить в сценарий R - скажем, метод setDataR (double []).

  2. Сценарий R выполнит некоторые вычисления, например вызовет метод double [] computeR ().

  3. Программа на Java получит результат вычисления, вызвав double [] getData (), который, в свою очередь, делегирует R-скрипту для получения вычисленных данных.

Как это можно сделать с помощью JRI, Rserv, Rcaller? Я не вижу возможности вызывать методы Rscript? Отправьте образец. Он должен быть похож на вызовы JNI (java, C ++).

  1. Неужели внутри jvm я думаю, что несколько потоков не могут правильно вызывать вызов сценария R? Любая работа?

Спасибо


person sset    schedule 29.05.2012    source источник


Ответы (2)


Самый простой способ использовать R из Java - использовать Runtime.exec(""), получить ответ и проанализировать его. Типичный пример того, как запускать собственные инструкции:

Process p = Runtime.getRuntime().exec("ls");
BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));
BufferedReader stdError = new BufferedReader(new InputStreamReader(p.getErrorStream()));

Отсюда вы можете прочитать и обработать результат, выводимый на стандартный вывод, который буферизуется в stdInput.

person Elsurexiste    schedule 22.03.2013
comment
Эта операция требует дополнительного процесса синтаксического анализа строки, который уже обрабатывается RCaller. - person jbytecode; 15.04.2014

RCaller делает именно то, что вы хотите. Предположим, у вас есть двойной массив 'a', который определяется как

double[] a = new double[] {1.0, 2.0, 3.0};

и вы хотите рассчитать среднее значение, медианное значение и стандартное отклонение. Создайте новый экземпляр RCaller

RCaller caller = new RCaller();
Globals.detect_current_rscript();
caller.setRscriptExecutable(Globals.Rscript_current);

RCode code = new RCode();


code.addDoubleMatrix("a", a);
code.addRCode("s <- list(mean=mean(a), median=median(a), sd=sd(a))");

caller.setRCode(code);

caller.runAndReturnResult("s");

double mean = caller.getParser().getAsDoubleArray("mean")[0];
double median = caller.getParser().getAsDoubleArray("median")[0];
double sd = caller.getParser().getAsDoubleArray("sd")[0];

а переменная median содержит значение 2,0, которое возвращается из сценария R. Для получения дополнительной информации посетите страницу здесь

person jbytecode    schedule 13.04.2014