人人 - 如何使用java中生成的值

时间:2013-08-15 06:34:31

标签: java r jri renjin

我正在使用renjin而我正在尝试使用我在java代码中使用r代码生成的值,例如:

int x = 7;

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

然而,这不起作用,因为引擎显然无法使用x。有没有一种简单的方法可以解决这个问题?

2 个答案:

答案 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并不熟悉,所以在黑暗中这是一个镜头。