我正在构建一个应用程序,我想用可以进行一些 nr 处理的模块来扩展它,我想为此使用 R。使用 R 扩展我的 Java 应用程序的最佳选择是什么?
6 回答
从 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,但它运行良好并且具有良好的性能。
我在将JGR(R 的 Java Gui)集成到我的 Java 应用程序中时获得了很好的体验。
请注意,REngine 不是多线程安全的。因此,您需要序列化对 REngine 的访问(例如,让它在自己的线程中运行)。您的应用程序和 JGR 都将使用 JRI 更新 R 变量和数据帧。现在,使用 JGR 的重要部分是可以使用 R 控制台,以便用户可以访问通过您的应用程序更新的数据,使用它,甚至动态更改它,绘制它等等;!这种编译 (Java) 和解释 (R) 模式的组合在用户体验方面非常令人满意。
此外,看起来 JGR 项目还很活跃。我使用的是 JGR 1.4,现在是 1.7(2009 年 6 月更新),所以一定要下载并试一试。
如果效果很好并且您变得雄心勃勃,请查看 biocep。
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
试试 RCaller,http: //www.mhsatman.com/rcaller.php
除了@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"));