0

Processing の描画部分の反復ごとに R でいくつかの計算を実行できる Processing のプログラムを作成しようとしています。これらの計算は、Rsession にロードする必要があるパッケージ内の関数を使用して行う必要があります。
Rserve を使用して R と Processing を接続しています。以前は次のことを行っていましたが、繰り返しごとに上記のライブラリが読み込まれます。

void draw{ 
  try {
  c.eval("library('png');library('glmnet')");
  }catch ( REXPMismatchException rme ) {
    rme.printStackTrace();
  } catch ( REngineException e ) {
    e.printStackTrace();
}

代わりに、次のことを試しました

void setup() {
try {
  RConnection c = new RConnection();
  c.eval("library('png');library('glmnet')");
  } catch ( REngineException e ) {
    e.printStackTrace();
  }
void draw() {
try {
  //calculations using functions from libraries above
  }catch ( REXPMismatchException rme ) {
    rme.printStackTrace();
  } catch ( REngineException e ) {
    e.printStackTrace();
  }
}

しかし、この 2 番目のアプローチでは、次のエラーが発生します。

Cannot find anything called "c"

したがって、セットアップ段階の後、接続が存続しないと推測しています。2 番目の構造を使用して再接続を維持するにはどうすればよいですか?

4

1 に答える 1

0

Rについては何も知りませんが、ここでの問題は、変数がスコープ外になることです。setup() 関数と draw() 関数の両方でスコープを与える場所、つまりスケッチの上部で宣言するだけです。

RConnection c;

void setup() {
  try {
    c = new RConnection();
    c.eval("library('png');library('glmnet')");
  } 
  catch ( REngineException e ) {
    e.printStackTrace();
  }
}

void draw() {
  try {
    //you can now use your c variable here
  }
  catch ( REXPMismatchException rme ) {
    rme.printStackTrace();
  }
  catch ( REngineException e ) {
    e.printStackTrace();
  }
}

Processing のスコープの詳細については、こちらを参照してください。

于 2015-02-18T15:26:31.353 に答える