将R函数作为Java方法参数传递

时间:2016-06-13 21:01:56

标签: java r methods rjava

我有一个问题,我现在试图解决几天。问题听起来像这样:

我在R中有一个功能:

f <- function(x) {
  x ^ 3 - x ^ 2 - 4 * x + 2;
}

但我想在Java中使用它,例如如下:double y = f(5)

我该怎么做?

现在,我在R中使用rJava包来使用java代码。我需要将此函数作为参数发送到java方法并计算其中的函数(当然我可以在R中调用函数并只发送结果,但事实并非如此,我需要Java中的函数作为一个整体)。

2 个答案:

答案 0 :(得分:1)

假设您正在使用REngine API来构建对函数的调用,请对其进行评估:

// get a reference to the function
REXP fn = eng.parseAndEval("function(x) x ^ 3 - x ^ 2 - 4 * x + 2", null, false);

// create a call and evaluate it
REXP res = eng.eval(new REXPLanguage(new RList( new REXP[] {
             fn, new REXPInteger(5)
                    })), null, true);
System.out.println("Result: " + res.asDouble());

你会得到

Result: 82.0

显然,如果您希望将功能保留为R侧的new REXPSymbol("f"),则可以使用fn代替f

PS:如果您想快速回答,请考虑使用rJava / JRI邮件列表stats-rosuda-devel

答案 1 :(得分:0)

您还可以使用 FastR ,它是基于GraalVM的R实现。与FastR等效的是:

Context ctx = Context.newBuilder("R").allowAllAccess(true).build();
Value fun = ctx.eval("R", "function(x) x ^ 3 - x ^ 2 - 4 * x + 2")
System.out.println(fun.execute(5);

此处有更多详细信息:https://medium.com/graalvm/faster-r-with-fastr-4b8db0e0dceb