2017-05-29 29 views
0

我在eclipse中創建了一個java應用程序。該應用程序使用Rserve軟件包連接到R並運行r腳本。運行我的應用程序之前,我必須從內部Rstudio開始rserve這樣的:如何在Windows中從java自動啓動rserve

library(Rserve) 
Rserve() 

這段Java代碼將被打包爲一個可執行文件,那麼有沒有一種方式,Rserve()被自動調用(在Windows中)只要代碼運行,以便我可以跳過通過RStudio啓動Rserve的手動步驟?

回答

1

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

1

我不確定是否有更乾淨的方法來做到這一點,但我解決這個問題的方法是從我的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