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

Posted

技术标签:

【中文标题】将 R 函数作为 Java 方法参数传递【英文标题】:Passing an R function as a Java method parameter 【发布时间】:2016-10-14 10:05:42 【问题描述】:

我有一个问题要解决几天。问题听起来像这样:

我在 R 中有一个函数:

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

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

我该怎么做?


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

【问题讨论】:

java.util.Math.pow(int a, int b) 返回a^b 的值。但是对于您的小权力,您可以根据需要使用x*x*xx*x。如果权力不是你的问题,那是什么?您想要有关 Java 编程的教程吗? 你从“例如”中没有理解什么。我想为复杂的多目标处理创建一个 R 项目,这在 R 中太贵了,我用 Java 构建它。我需要将复杂函数作为参数传递(从 R 到 Java),以便我可以在 Java 中处理这些函数。这些函数是输入值。 您可能想看看这个问题:***.com/questions/7451716/java-r-integration 提供了很多解决方案,其中一些我认为可能可行。 您的链接中的答案都没有回答我的问题。 没有人知道如何做到这一点?太糟糕了:(。 【参考方案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 端将函数保留为 f,则可以使用 new REXPSymbol("f") 而不是 fn

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

【讨论】:

不错!谢谢你。这是一个不错的方法,我稍后会尝试。现在我在 R 中做了评估部分,并在我的算法 Java 代码中调用了每个迭代。它并没有那么昂贵,因为经过几次测试,rJava 比 Java 本身多浪费了大约 0.0005 秒。【参考方案2】:

您还可以使用 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

【讨论】:

以上是关于将 R 函数作为 Java 方法参数传递的主要内容,如果未能解决你的问题,请参考以下文章

如何将 COM 方法作为函数参数传递?和 Microsoft 编译器错误 C3867

将变量名称作为参数从外部函数传递到 R 中的内部函数时出现问题?

仅将一些参数作为 R 中的命名列表传递给函数

将 JavaScript 函数作为参数传递

将 JavaScript 函数作为参数传递

在 R 中,如何将参数作为字符串传递给像 plotXtabs2 这样的函数?