2010-02-01 5 views
13

Wie können Sie R-Funktionalität am besten innerhalb von Java aufrufen?R aus Java

Ich bin auf der Suche nach einer schnellen, einfachen und zuverlässigen Möglichkeit, um 2D-Streudiagramme und Histogramme in R mit meinen Java-Anwendungen zu machen. Ich habe mich gefragt, welche Pakete/Interfaces in einer schnellen Google-Suche am bequemsten zu verwenden wären.

Ich freue mich auf Ihre Vorschläge!

+4

Duplizieren: http://stackoverflow.com/questions/1136709/extend-my-java-application-with-r – Shane

Antwort

15

Verwenden Sie JRI: http://www.rforge.net/JRI/. Es wird mit rJava mitgeliefert, einschließlich einiger Anwendungsbeispiele.

Ein sehr einfaches Beispiel würde wie folgt sein:

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"); 
     } 
    } 
} 
+6

Woher haben Sie die TextConsole() erhalten, die Sie als Parameter an Rengine übergeben haben? Ich kann dieses Programm deswegen nicht kompilieren. –

+0

Ich glaube nicht, dass ein unvollständiges Beispiel (ohne erforderliche 'import' Anweisungen) als akzeptierte Antwort ausgewählt werden sollte. @Shane: Wenn du kannst, fülle die Lücken des Beispiels, das du angegeben hast. – Giupo

+0

JRI hat ein Unterverzeichnis 'examples', in dem Sie ausführlichere Beispiele sehen können. In 'rtest.java' finden Sie das obige mit vielen Extras und finden auch die fehlende' class TextConsole implementiert RMainLoopCallbacks {...} ' – RolandASc

3

habe ich gefunden, dass R als Prozess gabelt, um den stdin, stdout des Prozesses Anbringen und Stderr Ströme und R Senden über die Eingangsstrom-Kommandos sehr effektiv sein. Ich benutze das Dateisystem, um zwischen R und meinem Java-Prozess zu kommunizieren. Auf diese Weise kann ich mehrere R-Prozesse von verschiedenen Threads in Java ausführen lassen, und ihre Umgebungen stehen nicht in Konflikt zueinander.

+2

Sie können mehrere Instanzen von JRI in separaten Threads laufen lassen und es wird keine geben Konflikt. – Shane

4

Es gibt etwas Neues genannt http://www.renjin.org/

Eine Sache, die ich es über JRI mag, ist, Bereitstellung Während jri erforderlich, dass Ihre Anwendung Benutzer R herunterladen werden, renjin nicht, und es wird nur die JVM auszuführen.