2

Vaadin フレームワークでRcallerを使用して、ブラウザーから R スクリプトを実行するためのプログラムを作成しています。機能の 1 つは、プロットを描画する機能です。これ自体はそれほど難しくありません。Rcaller を使用してこれを行う方法があります。ただし、私が見た限りでは、これらの方法はすべて、結果のプロットを R からファイル システムに保存し、それを Java で表示することを伴います。

これは最も不便であり、多くの時間とリソースを消費します。R からプロットをストリームとして取得し、その間に何も保存することなく Java に送信する方法が必要です。

これは何らかの形で可能ですか?

関数「grid.cap()」を調べました。現在表示されているプロットのスナップショットを取得し、色をマトリックスとして返します。これらは、RGB 値に変換できます。プロット自体の代わりに、これらの値をストリーミングすることは可能でしょうか? このアプローチには、少なくとも 1 つの問題があります。非常に遅いです。また、表示デバイスの状態にもよりますので、正確に何が返されるかについては非常に疑問です。

4

1 に答える 1

2

grid.cap() ではできないようですが、何らかの設定で問題が解決される可能性があります。そのようなテストファイルを作成しました:

    RCaller caller = new RCaller();
    RCode code = new RCode();
    caller.setRscriptExecutable("C:\\Program Files\\R\\R-3.0.2\\bin\\Rscript.exe");
    code.R_require("grid");
    code.addRCode("dev.new(width=.5, height=.5)");
    code.addRCode("grid.rect()");
    code.addRCode("grid.text(\"hi\")");
    code.addRCode("cap <- grid.cap()");
    code.addRCode("returns <- list(cap=cap)");
    code.addRCode("dev.off()");
    caller.setRCode(code);
    caller.runAndReturnResult("returns");
    int[] dims = caller.getParser().getDimensions("cap");
    System.out.println("Names: " + caller.getParser().getNames());
    System.out.println("Returned matrix dimensions: "+dims[0]+" - "+dims[1]);

このコードは次の出力を生成します。

Names: []
Returned matrix dimensions: 0 - 0

生成されたスクリプトを手動で実行すると、次のようになります。

grid.Call(L_cap) : このデバイスではラスター キャプチャを使用できません

Rscript はプロット用の適切なデバイスを検出できませんが、生成された RCaller スクリプトは正しく実行され、RGui で直接実行すると期待される出力が生成されます。

> dim(returns$cap)
[1]  47 116
> head(returns$cap)
 [,1]     [,2]     [,3]     [,4]     [,5]     [,6]     [,7]     [,8]     [,9]     [,10]   
 [1,] "gray67" "gray67" "gray67" "gray67" "gray67" "gray67" "gray67" "gray67" "gray67" "gray67"
 [2,] "gray67" "gray67" "gray67" "gray67" "gray67" "gray67" "gray67" "gray67" "gray67" "gray67"

私の意見では、間違っていたらご容赦ください。問題は、Rscript で実行される現在のデバイスのいずれかのグラフィックス デバイスまたは構成設定を見つけることです。

于 2014-04-28T09:47:27.557 に答える