Invoke R Язык / скрипт из Java
Как мы вызываем R язык / R скрипт из Java? В основном мне нужна Java-оболочка вокруг R-скрипта.
Данные будут переданы в слой Java, скажем, метод setData(double[]), который, в свою очередь, должен отправить в скрипт R - скажем, метод setDataR(double []).
R скрипт выполнит некоторые вычисления, скажем, вызовет метод double [] computeR ().
Java-программа получит результат вычислений, вызвав double[] getData(), который, в свою очередь, делегирует R-скрипт для получения вычисленных данных.
Как это может быть выполнено JRI, Rserv, Rcaller? Я не вижу способа вызвать методы Rscript? Пожалуйста, отправьте образец. Он должен быть похож на вызовы JNI (java, C++).
- В 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
,