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);

然后试试你原来的表达方式。不过,我对仁进不熟悉,所以有点摸不着头脑。

于 2013-08-15T06:49:54.680 回答