3

假设我在 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 重写该函数?还是有一种有效的方法来调用该函数?

谢谢!

4

1 回答 1

4

当你跑

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. 在 Java 代码中评估script.R、构造和评估命令,例如

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

每个选项都为您提供不同级别的灵活性,因此您可以尝试看看哪个最适合您。

于 2014-07-09T13:22:29.293 回答