2017-05-29 6 views
0

私はEclipseでJavaアプリケーションを作成しました。アプリケーションは、Rに接続してrスクリプトを実行するためにRserveパッケージを使用しました。私のアプリケーションを実行する前に、私はこのようなRstudio内からrserveを開始する必要があります。ウィンドウ内のjavaからrserveを自動的に起動する方法

library(Rserve) 
Rserve() 

このJavaコードはそうRserve()は、(Windowsの場合)、自動的に起動されている方法があり、実行可能ファイルとしてバンドルされるだろうすぐにコードが実行されるので、RStudioを使用してRserveを起動するこの手動手順をスキップできますか?

答えて

1

https://github.com/yannrichet/rsessionプロジェクトがあなたのためにまさにそれを実現しています。 https://github.com/subes/invesdwin-context-r これは、RSessionを統合し、パフォーマンス上の理由からRserve接続のプールを維持するため、多くのことをする必要はありません。スクリプトコードを変更することなく、JRI、RCaller、Renjinなどの他のランタイムソリューションに切り替えることもできます。

+0

JRIを使用するには、異なるDLLディレクトリとjarファイル私の懸念は、私は別のコンピュータで私のプロジェクトを使用する場合、私は再びすべてのパスをリセットする必要があるということです?私のアプリをデプロイする場合、パスはどのように設定されますか? –

+0

通常、Rscript実行可能ファイルのフォルダをアプリケーションのPATHに入れますが、rsessionを見るとレジストリからRインストールフォルダを読み込もうとすると同時に、実行可能ファイルを見つけるための一般的なパスも試行されます。しかし、ライブラリを改良して設定可能なパスを追加して検索することもできるので、メインアプリケーション(または理想的にはむしろシステムプロパティ)の起動パラメータを使って設定することができます。 – subes

+0

ああ、私はあなたがJRIについて尋ねたことに気づきました(上記のコメントはRsessionです)。また、libがjava.library.pathに追加して、私が提供しているシステムプロパティの代わりに見つけられるようにすることもできますinvesdwin-contextプロジェクトで提供されているようにAMainクラスを使用している場合は、コマンドライン引数 "-Dproperty.name = value"を使用してアプリケーションを起動します)。ただし、問題は常にネイティブライブラリと同じです。そのため、RCaller、Rserve、RenjinのサポートをJRIの代替として追加しました – subes

1

もっとクリーンな方法があれば分かりませんが、これを解決する方法は、Javaプログラム内からコンソールスタイルを起動することです。これが機能するためには、あなたのシステムパスにRの実行ファイルへのパスを入れてあります。

public Process rserve = null; 

public static void startRServer() throws InterruptedException, IOException { 
    // check the runtime environment to see if there's an active Rserve running 
    String existingRserve = ""; 
    try { 
     Process p = Runtime.getRuntime().exec("tasklist /FI \"IMAGENAME eq Rserve.exe\""); 
     p.waitFor(); 
     BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream())); 
     existingRserve = in.readLine(); 
    } catch(IOException e){} 

    if(rserve == null || existingRserve.contains("No tasks are running")) { 
     // start and rserve if we don't have one for this run yet, 
     // or if it has unexpectedly failed since we last used it 
     try { 
      rserve = Runtime.getRuntime().exec("Rscript -e \"library(Rserve); Rserve()\""); 
      rserve.waitFor(); 
     } catch (IOException e) { 
      System.out.print("*** R Error: Unable to start the R server ***"); 
     } 
    } 
} 
+0

私のシステムパスにR実行可能ファイルへのパスを与えるとします。今私は別のコンピュータで私のプロジェクトを使用する場合、私はパスをリセットする必要がありますか?私は私のアプリを展開することを望んでいると私に尋ねていると私はこれについて混乱しています。 –

+0

残念ながら、この方法では、R実行可能フォルダへのパスは、このプログラムが実行されるすべてのマシンのシステム環境変数に配置する必要があります。私はあなたのJavaプログラムの中からこれを行う方法があるかどうかはわかりません(私の推測は大規模なセキュリティホールとなるので、それは不可能でしょう...でも可能です) – lolynns

関連する問題