2014-05-09 4 views
7

Ich benutze JRI als Berechnungs-Slave für Statistiken innerhalb von Java. R-Berechnungen sind von Zeit zu Zeit erforderlich, aber nicht zu häufig. Daher entschied ich mich, eine Wrapper-Methode für die Berechnung zu erstellen, die eine neue REngine-Instanz erstellt und diese bis zum Ende schließt. Alles funktioniert wie ein Zauber, wenn man die Methode das erste Mal aufruft. Leider wird beim zweiten Aufruf der Fehler "R ist bereits initialisiert" ausgelöst.Java-R-Brücke "JRI" -Fehler: R ist bereits initialisiert

Initialisierung:

private static Rengine createEngineInstance(){ 

     //Initialise R Engine. 
     Rengine re=new Rengine (new String [] {"--vanilla"}, false, new CallbackListener()); 

     //Wait until REngine-thread is ready 
     if (!re.waitForR()) 
     { 
      System.err.println ("Cannot load R. Is the environment variable R_HOME set correctly?"); 
      System.exit(1); 
     } 
     return re; 
} 

Wrappermethode:

public static void performR(){ 

    //Create instance of R engine 
    Rengine re = createEngineInstance(); 

    //Perform some R operations 
    re.eval("..."); 

    re.end(); 

} 

Offensichtlich ist die REngine Instanz nicht korrekt beendet. Also muss ich wissen: 1) Gibt es eine Chance, die REngine zu beenden und später eine neue Instanz zu erstellen? Wie funktioniert das richtig? Ich weiß, dass es unmöglich ist, mehrere R-Threads gleichzeitig mit JRI auszuführen, aber das ist nicht mein Ziel. 2) Wenn dies nicht der Fall ist, würde ich eine Instanz mit dem Singleton-Muster erstellen. Wie kann ich in diesem Fall sicherstellen, dass die R-Sitzung beim Beenden des Programms geschlossen wird?

Ihre Hilfe wird sehr geschätzt! Vielen Dank!

+0

Obwohl dies nicht die Antwort ist, die Sie erwartet haben, versuchen Sie es mit Renjin http://www.renjin.org/, es verwendet nicht den R-Interpreter, also haben Sie nicht diese Art von Problem (es gibt andere Probleme damit obwohl ...) –

Antwort

7

nach JRI Javadoc ....

nur ein Rengine Instanz verwendet werden kann, und Rengine.end() Funktion hat einige Probleme ...

sollten Sie nicht Code verwenden, wie diese

Rengine engine = new Rengine(new String[] {"--vanilla"}, false, null); 

Sie Rengine mit diesem Code

Rengine engine = Rengine.getMainEngine(); 
if(engine == null) 
    engine = new Rengine(new String[] {"--vanilla"}, false, null); 
2

Sehr alte Frage verwenden kann, aber ich möchte hinzufügen dass RServe als Alternative oft attraktiv ist. Das Setup ist weniger involviert (meiner Meinung nach) und die Schnittstelle ist fast identisch.

Detaillierte Tutorial gegeben here.

Dies hat die zusätzlichen Vorteile, dass, wenn Sie jemals von R aus parallelen Threads von Java aufrufen möchten, können Sie dies tun.

+0

Immer noch sehr geschätzt. Vielen Dank! – Chris

Verwandte Themen