R из Java - PullRequest
       24

R из Java

15 голосов
/ 02 февраля 2010

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

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

Жду ваших предложений!

Ответы [ 5 ]

16 голосов
/ 02 февраля 2010

Использовать 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");
        }
    }
}
4 голосов
/ 06 июля 2014

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

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

2 голосов
/ 15 октября 2018

FastR является реализацией R. на основе GraalVM. Внедрить его в приложение JVM так же просто, как:

Context ctx = Context.newBuilder("R").allowAllAccess(true).build();
ctx.eval("R", "sum").execute(new int[] {1,2,3});

Для вашего конкретного примера в этом примере строится график рассеяния с использованием пакета lattice R, но вывод выводится в Graphics2D объект.

    Context context = Context.newBuilder("R").allowAllAccess(true).build();
    // This R function opens FastR graphics device passing it Graphics2D object,
    // then it plots the graph and closes the device
    String src =
        "library(grid); library(lattice); " +
        "function(graphics, width, height, x, y) { " +
        "   awt(width, height, graphics);" +
        "   print(xyplot(as.vector(x) ~ as.vector(y)));" +
        "   dev.off();" +
        "}";
    Value showPlot = context.eval("R", src);

    // Create a BufferedImage to use for the plotting
    BufferedImage image = new BufferedImage(WIDTH, HEIGHT, TYPE_INT_RGB);
    Graphics2D graphics = (Graphics2D) image.getGraphics();
    graphics.setBackground(new Color(255, 255, 255));
    graphics.clearRect(0, 0, WIDTH, HEIGHT);

    // Invoke R plotting code and pass it graphics object
    double[] x = new double[] {1.,2.,3.,4.};
    double[] y = new double[] {1.,2.,3.,4.};
    showPlot.execute(graphics, WIDTH, HEIGHT, x, y);

enter image description here

Есть также пример , который показывает графики внутри окна Swing.

enter image description here

Более подробную информацию о FastR вы можете найти в этой публикации: https://medium.com/graalvm/faster-r-with-fastr-4b8db0e0dceb

2 голосов
/ 02 февраля 2010

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

1 голос
/ 08 июня 2018

Пакеты или библиотеки для R с Java

Вызов R с Java

  • RCaller
  • Rserve
  • ИСР
  • Rsession
  • Renjin

Вызов Java с R

  • rJava
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...