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

new*_*bie 4 java r jri renjin

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

int x = 7;

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

但是,这不起作用,因为引擎显然无法使用x.有没有简单的方法来解决这个问题?

akb*_*ram 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());
Run Code Online (Sandbox Code Playgroud)

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"))
Run Code Online (Sandbox Code Playgroud)

您还可以通过扩展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;
  }
}
Run Code Online (Sandbox Code Playgroud)