13

我正在构建一个应用程序,我想用可以进行一些 nr 处理的模块来扩展它,我想为此使用 R。使用 R 扩展我的 Java 应用程序的最佳选择是什么?

4

6 回答 6

9

您可以使用JRI。从那个网站:

JRI 是一个 Java/R 接口,它允许在 Java 应用程序中作为单线程运行 R。基本上,它将 R 动态库加载到 Java 中,并为 R 功能提供 Java API。它支持对 R 函数的简单调用和完整运行的 REPL。

这是rJava项目的一部分(允许从 R 调用 Java)

于 2009-07-16T10:48:58.107 回答
4

从 Java 与 R 对话已使用 REngine API 进行了标准化。基本上有两种实现方式。

第一个实现是JRI。它基于 JNI,在 JVM 中执行 R dll。这意味着连接非常快。您可以使用完整的 R 功能,包括存在于 R 中但在 Java 中可访问/可修改的对象。缺点是不能使用多线程。

第二个实现是RServe。RServe 由一个用 C 编写的服务器和一个 Java 客户端组成。服务器从命令行启动,并包含 R dll。然后 java 客户端建立一个套接字连接并以序列化的方式调用 R。这个实现效果很好。缺点是,在 Windows 上,RServe 组件无法通过 fork 自身来处理多个连接。每个 RServe 实例只能为一个用户提供服务。

需要注意的另一种实现是 Java RMI 客户端,它调用使用 JRI 调用 R 的 Java 服务器。这个想法是您可以使用多线程,因为您可以一次与多个服务器通信。见http://www.londonr.org/remoterengine-londonR.pdf

在实践中,我们将 RServe 与大量样板代码一起用于启动和管理 RServe 实例。它基本上是一个主要的 PITA,但它运行良好并且具有良好的性能。

于 2012-03-13T22:15:02.687 回答
3

我在将JGR(R 的 Java Gui)集成到我的 Java 应用程序中时获得了很好的体验。

请注意,REngine 不是多线程安全的。因此,您需要序列化对 REngine 的访问(例如,让它在自己的线程中运行)。您的应用程序和 JGR 都将使用 JRI 更新 R 变量和数据帧。现在,使用 JGR 的重要部分是可以使用 R 控制台,以便用户可以访问通过您的应用程序更新的数据,使用它,甚至动态更改它,绘制它等等;!这种编译 (Java) 和解释 (R) 模式的组合在用户体验方面非常令人满意。

此外,看起来 JGR 项目还很活跃。我使用的是 JGR 1.4,现在是 1.7(2009 年 6 月更新),所以一定要下载并试一试。

如果效果很好并且您变得雄心勃勃,请查看 biocep。

于 2009-07-22T12:54:23.240 回答
2

FastR是基于GraalVM的 R 实现。将其嵌入 JVM 应用程序非常简单:

Context ctx = Context.newBuilder("R").allowAllAccess(true).build();
ctx.eval("R", "sum").execute(new int[] {1,2,3});

本文中的更多详细信息:https ://medium.com/graalvm/faster-r-with-fastr-4b8db0e0dceb

于 2018-10-11T20:59:17.410 回答
1

试试 RCaller,http: //www.mhsatman.com/rcaller.php

于 2010-07-28T08:33:38.247 回答
0

除了@Steves提到的 FastR 之外,还有renjin,但这非常相似:

// create a script engine manager:
RenjinScriptEngineFactory factory = new RenjinScriptEngineFactory();
// create a Renjin engine:
ScriptEngine engine = factory.getScriptEngine();
engine.eval(new java.io.FileReader("script.R"));
于 2018-10-11T22:14:35.037 回答