如果您在R中创建了一个函数,那么如何使用Renjin在Java中调用它?

时间:2014-07-08 19:31:19

标签: java r renjin

我们说我在R中创建了一个函数

bin <- function(arg1, arg2, arg3) {
//some code here
}

我正在使用Renjin在JVM上运行R.从我的Java程序,我想调用我的R函数bin。我知道你需要先使用类似的东西来访问R

ScriptEngineManager manager = new ScriptEngineManager();
// create a Renjin engine:
ScriptEngine engine = manager.getEngineByName("Renjin");

但是一旦完成,我究竟如何访问我的R功能?此功能存储在单独的文件中。我知道要运行R脚本(让我们调用此script.R),你可以使用

engine.eval(new java.io.FileReader("script.R"));

但是这并不允许在文件中的函数中传递参数...它只是运行整个事情。

我是否必须在我的Java程序中使用R / Renjin重写函数?或者有一种有效的方法来调用函数吗?

谢谢!

1 个答案:

答案 0 :(得分:3)

运行时

engine.eval(new java.io.FileReader("script.R"));

解析script.R文件,并在全局环境中执行文件中的语句。如果您的文件只定义了函数,那么它确实不会被调用。

执行该功能有几个选项:

  1. 延长script.R以包含对bin的调用,例如

    bin <- function(arg1, arg2, arg3) {
    //some code here
    }
    bin(arg1 = 1, arg2 = 2, arg3 = 3)
    
  2. 评估script.R,在Java代码中构造和评估命令,例如

    engine.eval(new java.io.FileReader("script.R"));
    

    接着是

    engine.eval("bin(arg1 = " + 1 + ", arg2 = " + 2 + ", arg3 = " + 3 + ")");
    
  3. 评估script.R,在全局环境中创建变量,然后执行bin函数:

    engine.eval(new java.io.FileReader("script.R"));
    engine.eval("arg1 <- 1; arg2 <- 2; arg3 <- 3");
    engine.eval("bin(arg1, arg2, arg3)");
    
  4. 每个选项都为您提供不同级别的灵活性,因此您可以尝试查看最适合您的选项。