我正在使用 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);
然后试试你原来的表达方式。不过,我对仁进不熟悉,所以有点摸不着头脑。