用R扩展我的Java应用程序?

用R扩展我的Java应用程序?,java,scripting,r,plugins,jvm,Java,Scripting,R,Plugins,Jvm,我正在构建一个应用程序,我想用模块进行扩展,这些模块可以进行一些nr运算,我想用R来实现这一点。使用R扩展Java应用程序的最佳选项是什么?您可以使用。从该网站: JRI是一个Java/R接口,它 允许在Java内部运行R 将应用程序作为单个线程。 基本上,它加载R动态库 转换为Java,并为R提供Java API 功能。它支持简单的 调用R函数和一个完整的 正在运行REPL 这是项目的一部分(它允许从R调用Java)我在集成到Java应用程序中有很好的经验 请注意,REngine不是多线程安全

我正在构建一个应用程序,我想用模块进行扩展,这些模块可以进行一些nr运算,我想用R来实现这一点。使用R扩展Java应用程序的最佳选项是什么?

您可以使用。从该网站:

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


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

我在集成到Java应用程序中有很好的经验

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

而且,JGR项目看起来相当活跃;我使用的是JGR1.4,现在是1.7(2009年6月更新),所以请务必下载并试用


如果这样做效果很好,并且你有雄心壮志,那么看看biocep。

试试RCaller,

使用REngine API对Java中的R进行了标准化。基本上有两种实现

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

第二个实现是RServe。RServe由一个用C编写的服务器和一个Java客户端组成。服务器从命令行启动,并包含R dll。然后,java客户机进行套接字连接,并以串行方式调用R。这个实现工作得很好。缺点是,在Windows上,RServe组件无法自行分叉以处理多个连接。每个RServe实例只能为一个用户提供服务器

另一个需要注意的实现是JavaRMI客户机,它使用JRI调用Java服务器调用R。其思想是,您可以使用多线程,因为您可以同时与多个服务器进行通信。看


在实践中,我们将RServe与许多样板代码一起用于启动和管理RServe实例。它基本上是一个主要的PITA,但工作良好,性能良好。

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

Context ctx = Context.newBuilder("R").allowAllAccess(true).build();
ctx.eval("R", "sum").execute(new int[] {1,2,3});
本文中的更多详细信息:

除了@Steves提到的FastR之外,还有一些,但它们相当相似:

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

我必须承认,我今天学到了一些东西。我最初以为你用R来代表Ruby lol,直到今天我才听说R编程语言。请注意,这种方法不能使用多线程。特别是由于这个限制,我们使用了RServe包。我们使用System类在Windows中启动我们自己的RServe实例。您的链接是404ing。不确定“每个RServe实例只能为一个用户服务”是什么意思?您是说仅在windows上使用RServe吗?RServe服务器启动单个进程并侦听端口6311。建立连接后,Linux版本将启动一个单独的进程来处理该连接。Windows版本处理同一服务器进程中的连接,因此停止接受新连接。是的,所以你说的只是“Windows上的Rserve”,对吗?是的,我是。Linux上的Rserve没有此限制。