Invoke R Язык / скрипт из Java

Как мы вызываем R язык / R скрипт из 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? Любая работа вокруг?

Спасибо

2 ответа

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

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];

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

Самый простой способ использовать 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,

Другие вопросы по тегам