R из Java

Какой лучший способ вызвать функциональность R из Java?

Я ищу быстрый, простой и надежный способ сделать стандартные 2D-диаграммы и гистограммы в R, используя мои Java-приложения. Мне было интересно, какие пакеты/интерфейсы, возникшие в результате быстрого поиска Google, будут наиболее удобны в использовании.

Я с нетерпением жду ваших предложений!

Ответы

Ответ 1

Использовать JRI: http://www.rforge.net/JRI/. Он поставляется в комплекте с rJava, включая некоторые примеры использования.

Очень простой пример:

import java.io.*;
import java.awt.Frame;
import java.util.Enumeration;

import org.rosuda.JRI.Rengine;
import org.rosuda.JRI.REXP;
import org.rosuda.JRI.RVector;
import org.rosuda.JRI.RMainLoopCallbacks;

public class rJavaTest {

    public static void main(String[] args) {

        Rengine re=new Rengine(args, false, new TextConsole());
        REXP x;
        re.eval("print(1:10/3)");
        System.out.println(x=re.eval("iris"));
        RVector v = x.asVector();
        if (v.getNames()!=null) {
            System.out.println("has names:");
            for (Enumeration e = v.getNames().elements() ; e.hasMoreElements() ;) {
                System.out.println(e.nextElement());
            }
        }

        if (true) {
            System.out.println("Now the console is yours ... have fun");
            re.startMainLoop();
        } else {
            re.end();
            System.out.println("end");
        }
    }
}

Ответ 2

Есть что-то новое, называемое http://www.renjin.org/

Одна вещь, которая мне нравится в JRI, - это развертывание, в то время как JRI требуется, чтобы пользователи вашего приложения загружали R, renjin нет, и он использует только JVM для запуска.

Ответ 3

Я обнаружил, что форсирование R в качестве процесса, присоединение к потокам stdin, stdout и stderr процесса и отправка R-команд через входной поток, чтобы быть достаточно эффективными. Я использую файловую систему для связи между R и моим процессом Java. Таким образом, я могу иметь несколько процессов R, выполняющихся из разных потоков в Java, и их среды не конфликтуют друг с другом.