4

私は renjin を使用しており、Java コードで生成した値を r コードで使用しようとしています。たとえば、次のようになります。

int x = 7;

try
{
   engine.eval("tmp<-c(x, 4)");
   engine.eval("print(tmp)");
}
catch (ScriptException ex) 
{
   ;
}

ただし、エンジンは明らかに x では動作しないため、これは機能しません。これを解決する簡単な方法はありますか?

4

2 に答える 2

6

Renjin は javax.script インターフェースを使用します。これにより、R 環境と対話するための多くの機能が提供されます。こちらのドキュメントを参照してください: http://docs.oracle.com/javase/6/docs/technotes/guides/scripting/programmer_guide/

R のグローバル環境内で変数を設定するには、put() メソッドを使用できます。ここではいくつかの例を示します。

engine.put("x", 4);
engine.put("y", new double[] { 1d, 2d, 3d, 4d });
engine.put("z", new org.renjin.sexp.DoubleArrayVector(1,2,3,4,5));
engine.put("obj", new HashMap());

Renjin は、プリミティブ、プリミティブの配列、および java.lang.String インスタンスを暗黙的に R オブジェクトに変換します。Java オブジェクトは Rexternalオブジェクトとしてラップされます。

R コードから Renjin を使用すると、$演算子を使用して Java オブジェクトを操作できます。次に例を示します。

obj$put("a", 1)
obj$put("b", 2) 

print(obj$size())
print(obj$get("b"))

org.renjin.sexp パッケージのクラスを拡張することにより、R オブジェクトの独自の実装を提供することもできます。例えば:

public class MyDoubleVector extends DoubleVector {

  public double getElementAsDouble(int index) {
       // lookup value in database
       return index;
  }

  public int length() {
       // query length in database
       return length;
  }
}
于 2013-09-06T07:32:47.583 に答える
3

コメントに投稿したように、変数をリテラルとして文字列に連結できます。

engine.eval("tmp<-c(" + x + ", 4)");

これが機能するのは、エンジンがリテラル式を (変数ではなく数値で) 評価する必要があり、上記の式が基本的tmp<-c(7, 4)に文字列と整数値の連結 (組み合わせ) を通過するためです。また、最初にコマンドを実行して変数を保存し、次にそれを参照してみます。

engine.eval(x <- 7);

そして、オリジナルの表現を試してみてください。しかし、私はRenjinに慣れていないので、暗闇の中のショットです.

于 2013-08-15T06:49:54.680 に答える