私は、いくつかのnrクランチを行うモジュールで拡張したいアプリケーションを構築していますが、そのためにRが必要です。RでJavaアプリケーションを拡張するための最良のオプションは何ですか?
6 に答える
JavaからRとの通信は、REngineAPIを使用して標準化されています。これには基本的に2つの実装があります。
最初の実装はJRIです。これはJNIに基づいており、JVM内でRdllを実行します。これは、接続が非常に高速であることを意味します。R内に存在するが、Javaでアクセス/変更可能なオブジェクトを含む、完全なR機能を使用できます。欠点は、マルチスレッドを使用できないことです。
2番目の実装はRServeです。RServeは、JavaクライアントとともにCで記述されたサーバーで構成されています。サーバーはコマンドラインから起動され、Rdllが含まれています。次に、Javaクライアントはソケット接続を確立し、シリアル化された方法でRを呼び出します。この実装はうまく機能します。欠点は、Windowsでは、RServeコンポーネントが複数の接続を処理するためにそれ自体をフォークできないことです。すべてのRServeインスタンスは、1人のユーザーのみにサーバーを提供できます。
注意すべき代替実装は、JRIを使用してRを呼び出すJavaサーバーを呼び出すJavaRMIクライアントです。一度に複数のサーバーと通信できるため、マルチスレッドを使用できるという考え方です。http://www.londonr.org/remoterengine-londonR.pdfを参照してください
実際には、RServeインスタンスを起動および管理するために、RServeを多くの定型コードと一緒に使用しました。これは基本的に主要なPITAですが、うまく機能し、優れたパフォーマンスを発揮します。
私は、JGR、Java GuiforRをJavaアプリケーションに統合する良い経験をしました。
REngineはマルチスレッドセーフではないことに注意してください。したがって、REngineへのアクセスをシリアル化する必要があります(たとえば、REngineを独自のスレッドで実行させるなど)。アプリケーションとJGRはどちらも、JRIを使用してR変数とデータフレームを更新します。JGRを使用することの大きな利点は、Rコンソールを使用できることです。これにより、ユーザーはアプリを介して更新中のデータにアクセスしたり、遊んだり、オンザフライで変更したり、プロットしたりすることができます。コンパイルされた(Java)モードと解釈された(R)モードのこの組み合わせは、ユーザーエクスペリエンスの点で非常に満足のいくものです。
また、JGRプロジェクトはかなり生きているようです。私はJGR1.4を使用していましたが、現在は1.7(2009年6月更新)になっているので、ぜひダウンロードして試してみてください。
それがうまく機能し、野心的になっている場合は、biocepを見てください。
FastRは、RのGraalVMベースの実装です。JVMアプリケーションへの埋め込みは、次のように簡単です。
Context ctx = Context.newBuilder("R").allowAllAccess(true).build();
ctx.eval("R", "sum").execute(new int[] {1,2,3});
この記事の詳細:https ://medium.com/graalvm/faster-r-with-fastr-4b8db0e0dceb
@Stevesによって言及されたFastRに加えて、renjinもありますが、これはかなり類似しています。
// create a script engine manager:
RenjinScriptEngineFactory factory = new RenjinScriptEngineFactory();
// create a Renjin engine:
ScriptEngine engine = factory.getScriptEngine();
engine.eval(new java.io.FileReader("script.R"));