【问题标题】:How to start rserve automatically from java in windows如何在windows中从java自动启动rserve
【发布时间】:2017-05-29 16:18:33
【问题描述】:

我在 Eclipse 中创建了一个 java 应用程序。该应用程序使用 Rserve 包连接到 R 并运行 r 脚本。在运行我的应用程序之前,我必须像这样在 Rstudio 中启动 rserve:

library(Rserve)
Rserve()

这个 Java 代码将被捆绑为一个可执行文件,所以有没有一种方法可以在代码运行后立即自动调用 Rserve()(在 Windows 中),这样我就可以跳过使用通过启动 Rserve 的手动步骤RStudio?

【问题讨论】:

    标签: java r eclipse rserve


    【解决方案1】:

    https://github.com/yannrichet/rsession 项目正是为您实现了这一目标。

    虽然看看这个可能会很有趣:https://github.com/subes/invesdwin-context-r 由于它集成了 RSession 并出于性能原因保留了一个 Rserve 连接池,因此您无需为此做太多事情。您还可以切换到 JRI、RCaller、Renjin 等其他运行时解决方案,而无需更改脚本代码。

    【讨论】:

    • 要使用JRI,我们必须设置不同的DLL dir和jar文件的路径。我担心的是,如果我在另一台计算机上使用我的项目,我是否必须再次重置所有路径?如果我部署我的应用程序,路径将如何设置?
    • 通常你将 Rscript 可执行文件的文件夹放入应用程序的 PATH 中,但是当你查看 rsession 时,你会看到它还尝试从注册表中读取 R 安装文件夹并尝试一些查找可执行文件的常用路径。虽然改进库以允许添加可配置的搜索路径并不难,但您可以通过主应用程序的启动参数(或者理想情况下是系统属性)对其进行配置。
    • 啊,我注意到您询问了 JRI(上面的评论是关于 Rsession),您还可以通过将它添加到 java.library.path 或者我提供的系统属性来确保找到该库(如果您使用由 invesdwin-context 项目提供的 AMain 类,则可以在启动期间通过命令行参数“-Dproperty.name=value”覆盖它们),尽管问题总是与本机库相同。这就是为什么我添加了对 RCaller、Rserve、Renjin 的支持作为 JRI 的替代品
    • 您可以在此处阅读有关 invesdwin-context 提供的系统属性机制的更多信息:github.com/subes/invesdwin-context 您也可以完全禁用平台初始化以推出您自己的解决方案。 R 模块也可以在没有初始化 spring-context 的情况下工作
    • 感谢您提供的所有信息。我去看看
    【解决方案2】:

    我不确定是否有更简洁的方法来执行此操作,但我解决此问题的方法是从我的 java 程序中以控制台样式启动它。为此,您必须将 R 可执行文件的路径放在系统路径中:

    public Process rserve = null;
    
    public static void startRServer() throws InterruptedException, IOException {
        // check the runtime environment to see if there's an active Rserve running
        String existingRserve = "";
        try {
            Process p = Runtime.getRuntime().exec("tasklist /FI \"IMAGENAME eq Rserve.exe\"");
            p.waitFor();
            BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
            existingRserve = in.readLine();
        } catch(IOException e){}
    
        if(rserve == null || existingRserve.contains("No tasks are running")) {
            // start and rserve if we don't have one for this run yet, 
            // or if it has unexpectedly failed since we last used it
            try {
                rserve = Runtime.getRuntime().exec("Rscript -e \"library(Rserve); Rserve()\"");
                rserve.waitFor();
            } catch (IOException e) {
                System.out.print("*** R Error: Unable to start the R server ***");
            }
        }
    }
    

    【讨论】:

    • 假设我在我的系统路径中给出了 R 可执行文件的路径。现在,如果我在另一台计算机上使用我的项目,我是否必须重置路径?我问是因为我希望部署我的应用程序,但我对此感到困惑。
    • 不幸的是,对于这种方法,R 可执行文件夹的路径需要放在运行该程序的每台机器的系统环境变量中。我不确定是否有办法在您的 Java 程序中执行此操作(我的猜测是否定的,因为这将是一个巨大的安全漏洞......但这是可能的)
    最近更新 更多