r與java整合(轉)


http://jliblog.com/archives/10

R是統計計算的強大工具,而JAVA是做應用系統的主流語言,兩者天然具有整合的需要。關於整合,一方面,R中可以創建JAVA對象調用JAVA方法,另一方面,JAVA中可以轉換R的數據類型調用R的函數,互相取長補短。現在也有一個項目JGR,用JAVA做R的圖形界面,可以實現高亮顯示自動補全等,還能讓JAVA和R互相調用。

  關於R中調用JAVA,我想主要是為了利用其面向對象的特性,畢竟R語言近來很致力於向面向對象發展,有個很好的項目rJava可以實現,在www.rforge.net/rJava上。R中調JAVA對我似乎意義不大,本文主要介紹JAVA中調用R。所有測試都在Windows XP、R2.10.1和JDK1.6下完成。

  JAVA很適合開發應用系統,但是數學建模和計算能力非其所長,如果該系統需要進行大量的統計或者優化的計算,調用R是一種很好的方式。JAVA負責系統的構建,R用來做運算引擎,從而實現應用型和分析性相結合的系統。

  首先要介紹的是Rserve的方式,這是一個基於TCP/IP的服務器,通過二進制協議傳輸數據,可以提供遠程連接,使得客戶端語言能夠調用R。目前Rserve作為一個package發布在CRAN上,可以直接使用install.packages("Rserve")進行安裝。需要使用時在R控制台下加載該包,然后輸入命令Rserve(),開啟服務器,就可以供客戶端調用。

  其客戶端可以有多種,這里只介紹JAVA客戶端。最早的客戶端包是JRclient,在www.rosuda.org/Rserve上還可以下載到,但是現在該項目全部移到了www.rforge.net/Rserve,使用REngine作客戶端(和JRI一致),在該網站下可以下載到REngine.jar和RserveEngine.jar兩個文件。如果用eclipse開發的話,在工程屬性中導入這兩個外部的jar包,就可以正常使用了。

  一個簡單的例子:

public class rtest {
  public static void main(String[] args) throws REXPMismatchException, REngineException {
    RConnection c = new RConnection();
    REXP x = c.eval("R.version.string");
    System.out.println(x.asString());
  }
}

 首先建立一個新的連接,然后就可以使用eval之類的方法將R中的表達式傳到服務器端,通過R求值后傳回JAVA中REXP類型的變量,然后打印出來,整個過程非常簡單。由於不需要對R進行初始化,因此速度會比較快。在其他系統下可以同時建立多個連接,但是在Windows下只允許同時打開一個連接,后續的連接都會共有相同的命名空間。官網上不建議在Windows下使用Rserve,因為會喪失很多性能,他們推薦可以考慮DCOM的方式。不過DCOM那個工程沒有現成的jar包可用,其實如果是拿R做分析系統中的運算引擎,單連接夠用了。

  另一種方式是JRI,全名是Java/R Interface,這是一種完全不同的方式,通過調用R的動態鏈接庫從而利用R中的函數等。目前該項目已經成了rJava的子項目,不再提供單獨的JRI的版本。因此使用時簡單地通過install.packages("rJava")安裝rJava就行,在安裝文件夾中,可以看到一個jri的子文件夾,里面有自帶的例子可以用來測試。

  裝好后要修改系統的環境變量,在PATH中添加%R_HOME%bin和%R_HOME%libraryrJavajri,注意R_HOME的路徑要正確,重啟系統使之生效。使用時同樣在eclipse里導入外部的jar包(在www.rforge.net/rJava下載JRI.jar、REngine.jar和JRIEngine.jar這三個文件),在rJava包安裝目錄下的jriexamples里有現成的例子(rtest.java和rtest2.java),可以測試是否成功。

  之前我的電腦上一直存在一個很奇怪的問題,測試第一個例子時在“Creating Rengine (with arguments)”的時候就停住了,第二個例子中一個JAVA框很快閃一下就消失了,控制台中沒有任何提示。打開JGR也是一閃即逝。在網上查了很久,只有一個印度哥們也遇到過類似的問題,而且沒有找到解決辦法。估計應該是實現RMainLoopCallbacks時出了問題,但是找不到原因,后來卸載了R2.9.0重裝了R2.10.1,並且通過install.packages安裝,終於沒問題了,可能是主程序和Package之間的版本沖突,以后記住全部用install.packages來安裝package了。

  關於客戶端服務器的方式和動態鏈接庫的方式,各有所長,按照需要選用。個人經驗,不管使用哪種方式,設計時盡量少進行頻繁的數據的交互,在邏輯上把系統和計算分開,使得R成為一個純粹的運算引擎。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM