私は renjin を使用しており、Java コードで生成した値を r コードで使用しようとしています。たとえば、次のようになります。
int x = 7;
try
{
engine.eval("tmp<-c(x, 4)");
engine.eval("print(tmp)");
}
catch (ScriptException ex)
{
;
}
ただし、エンジンは明らかに x では動作しないため、これは機能しません。これを解決する簡単な方法はありますか?
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;
}
}
コメントに投稿したように、変数をリテラルとして文字列に連結できます。
engine.eval("tmp<-c(" + x + ", 4)");
これが機能するのは、エンジンがリテラル式を (変数ではなく数値で) 評価する必要があり、上記の式が基本的tmp<-c(7, 4)
に文字列と整数値の連結 (組み合わせ) を通過するためです。また、最初にコマンドを実行して変数を保存し、次にそれを参照してみます。
engine.eval(x <- 7);
そして、オリジナルの表現を試してみてください。しかし、私はRenjinに慣れていないので、暗闇の中のショットです.