如何在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等其他运行时解决方案,而无需更改脚本代码。
我不确定是否有更干净的方法来做到这一点,但我解决这个问题的方法是从我的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程序中是否有办法做到这一点(我的猜测是否定的,因为这将是一个巨大的安全漏洞......但它可能) – lolynns
要使用JRI,我们必须设置路径不同的DLL目录和jar文件。我担心的是,如果我在不同的计算机上使用我的项目,我将不得不重新设置所有路径?如果我部署我的应用程序,路径将如何设置? –
通常情况下,您将Rscript可执行文件的文件夹放入应用程序的PATH中,但是当您查看rsession时,您会看到它另外尝试从注册表中读取R安装文件夹,并尝试使用一些通用路径来查找可执行文件。尽管不难改进库以允许添加可配置的路径进行搜索,因此您可以通过主应用程序中的启动参数(或者理想的系统属性)对其进行配置。 – subes
啊,我注意到你问了JRI(上面的评论是令人失望的Rsession),你也可以通过将它添加到java.library.path或者我提供的系统属性中来确保找到lib(你可以在启动时覆盖它们通过命令行参数“-Dproperty.name = value”,在应用程序启动过程中,如果使用invesdwin-context项目提供的AMain类),但问题始终与本地库相同。这就是为什么我添加了对RCaller,Rserve,Renjin的支持作为JRI的替代方案 – subes