如何在Windows中从java自动启动rserve

问题描述:

我在eclipse中创建了一个java应用程序。该应用程序使用Rserve软件包连接到R并运行r脚本。运行我的应用程序之前,我必须从内部Rstudio开始rserve这样的:如何在Windows中从java自动启动rserve

library(Rserve) 
Rserve() 

这段Java代码将被打包为一个可执行文件,那么有没有一种方式,Rserve()被自动调用(在Windows中)只要代码运行,以便我可以跳过通过RStudio启动Rserve的手动步骤?

https://github.com/yannrichet/rsession项目实现正是你。

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

+0

要使用JRI,我们必须设置路径不同的DLL目录和jar文件。我担心的是,如果我在不同的计算机上使用我的项目,我将不得不重新设置所有路径?如果我部署我的应用程序,路径将如何设置? –

+0

通常情况下,您将Rscript可执行文件的文件夹放入应用程序的PATH中,但是当您查看rsession时,您会看到它另外尝试从注册表中读取R安装文件夹,并尝试使用一些通用路径来查找可执行文件。尽管不难改进库以允许添加可配置的路径进行搜索,因此您可以通过主应用程序中的启动参数(或者理想的系统属性)对其进行配置。 – subes

+0

啊,我注意到你问了JRI(上面的评论是令人失望的Rsession),你也可以通过将它添加到java.library.path或者我提供的系统属性中来确保找到lib(你可以在启动时覆盖它们通过命令行参数“-Dproperty.name = value”,在应用程序启动过程中,如果使用invesdwin-context项目提供的AMain类),但问题始终与本地库相同。这就是为什么我添加了对RCaller,Rserve,Renjin的支持作为JRI的替代方案 – subes

我不确定是否有更干净的方法来做到这一点,但我解决这个问题的方法是从我的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 ***"); 
     } 
    } 
} 
+0

假设我给我的系统路径中的R可执行文件的路径。现在,如果我在不同的计算机上使用我的项目,我将不得不重置路径?我问,我希望部署我的应用程序,我对此感到困惑。 –

+0

对于这种方法不幸的是,对于运行该程序的每台机器,R可执行文件夹的路径需要放在系统环境变量中。我不确定在Java程序中是否有办法做到这一点(我的猜测是否定的,因为这将是一个巨大的安全漏洞......但它可能) – lolynns