13

私は、いくつかのnrクランチを行うモジュールで拡張したいアプリケーションを構築していますが、そのためにRが必要です。RでJavaアプリケーションを拡張するための最良のオプションは何ですか?

4

6 に答える 6

9

JRIを使用できます。そのウェブサイトから:

JRIはJava/Rインターフェースであり、Javaアプリケーション内でRをシングルスレッドとして実行できます。基本的に、RダイナミックライブラリをJavaにロードし、Java APItoR機能を提供します。R関数への単純な呼び出しと完全に実行されているREPLの両方をサポートします。

これはrJavaプロジェクトの一部です(RからJavaを呼び出すことができます)

于 2009-07-16T10:48:58.107 に答える
4

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ですが、うまく機能し、優れたパフォーマンスを発揮します。

于 2012-03-13T22:15:02.687 に答える
3

私は、JGR、Java GuiforRをJavaアプリケーションに統合する良い経験をしました。

REngineはマルチスレッドセーフではないことに注意してください。したがって、REngineへのアクセスをシリアル化する必要があります(たとえば、REngineを独自のスレッドで実行させるなど)。アプリケーションとJGRはどちらも、JRIを使用してR変数とデータフレームを更新します。JGRを使用することの大きな利点は、Rコンソールを使用できることです。これにより、ユーザーはアプリを介して更新中のデータにアクセスしたり、遊んだり、オンザフライで変更したり、プロットしたりすることができます。コンパイルされた(Java)モードと解釈された(R)モードのこの組み合わせは、ユーザーエクスペリエンスの点で非常に満足のいくものです。

また、JGRプロジェクトはかなり生きているようです。私はJGR1.4を使用していましたが、現在は1.7(2009年6月更新)になっているので、ぜひダウンロードして試してみてください。

それがうまく機能し、野心的になっている場合は、biocepを見てください。

于 2009-07-22T12:54:23.240 に答える
2

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

于 2018-10-11T20:59:17.410 に答える
1

RCaller、http: //www.mhsatman.com/rcaller.phpをお試しください

于 2010-07-28T08:33:38.247 に答える
0

@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"));
于 2018-10-11T22:14:35.037 に答える