我在eclipse中創建了一個java應用程序。該應用程序使用Rserve軟件包連接到R並運行r腳本。運行我的應用程序之前,我必須從內部Rstudio開始rserve這樣的:如何在Windows中從java自動啓動rserve
library(Rserve)
Rserve()
這段Java代碼將被打包爲一個可執行文件,那麼有沒有一種方式,Rserve()被自動調用(在Windows中)只要代碼運行,以便我可以跳過通過RStudio啓動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