我正在使用renjin而我正在尝试使用我在java代码中使用r代码生成的值,例如:
int x = 7;
try
{
engine.eval("tmp<-c(x, 4)");
engine.eval("print(tmp)");
}
catch (ScriptException ex)
{
;
}
然而,这不起作用,因为引擎显然无法使用x。有没有一种简单的方法可以解决这个问题?
答案 0 :(得分:5)
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对象将被包装为R external
个对象。
从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;
}
}
答案 1 :(得分:3)
您可以将变量作为文字连接到字符串中,就像我在评论中发布的那样:
engine.eval("tmp<-c(" + x + ", 4)");
这是因为(我假设)引擎需要评估文字表达式(使用数值而不是变量),并且上面的表达式基本上通过字符串和整数值的串联(组合)传递tmp<-c(7, 4)
。我会先尝试运行一个命令来存储变量,然后引用它,即:
engine.eval(x <- 7);
然后尝试你的原始表达。不过我对Renjin并不熟悉,所以在黑暗中这是一个镜头。