Java調用R語言


R是統計計算的強大工具,JAVA是做應用系統的主流語言。JAVA負責系統的構建,R用來做運算引擎,從而實現應用型和分析性相結合的系統。

  一、Rserve(遠程通信模式)
  Rserve是一個基於TCP/IP的服務器,通過二進制協議傳輸數據,可以提供遠程連接,使得客戶端語言能夠調用R。
  Rserve作為一個package發布在CRAN上,可以直接使用install.packages("Rserve")進行安裝。需要使用時在R控制台下加載該包,然后輸入命令Rserve(),開啟服務器就可以供客戶端調用。首先建立一個新的連接,然后就可以使用eval之類的方法將R中的表達式傳到服務器端,通過R求值后傳回JAVA中REXP類型的變量,然后打印出來,整個過程非常簡單。由於不需要對R進行初始化,因此速度會比較快。在其他系統下可以同時建立多個連接,但是在Windows下只允許同時打開一個連接,后續的連接都會共有相同的命名空間。
  1、Rserve安裝和啟動(windows環境)
  方法一:前提:安裝並配置了R語言
    第一次啟動安裝Rserve包:
    install.packages("Rserve")

    第一次啟動加載Rserve包:
    library(Rserve)

    啟動Rserve服務:
    Rserve()

    關閉Rconnection連接:
    關閉Rconnection連接用rc.close();

  方法二:點擊R工具欄上的“程序包”--》“設定CRAN鏡像”--》China(xxx) —》確定
    點擊【程序包】—》安裝程序包—》選擇 rJava —>OK
    點擊【程序包】—》安裝程序包—》選擇 Rserve —>OK

    點擊【程序包】—》加載程序包—》選擇 rJava —>OK
    點擊【程序包】—》加載程序包—》選擇 Rserve —>OK

    安裝命令:install.packages("packageName")
    加載命令:library(packageName)

    啟動命令:Rserve()

  2.Java調用R
    基本方法:
    Rconnection:連接R服務
    eval():執行R語句
    assgin():聲明變量
    REXP:
        asInteger(), asIntegers(), asString(), asDouble(), asDoubles(), asList()獲取相應類型的數據

    引用R架包或者添加maven配置:

<!--REngine Java Interface to R -->
<dependency>
    <groupId>org.rosuda.REngine</groupId>
    <artifactId>REngine</artifactId>
    <version>2.1.0</version>
</dependency>
<dependency>
    <groupId>org.rosuda.REngine</groupId>
    <artifactId>Rserve</artifactId>
    <version>1.8.1</version>
</dependency> 

    實例1:求一個數組里面的最大值

//建立連接
RConnection rc=new RConnection();
//構建數據
int[] datas={314,451,56,24,631};
//聲明變量,相當於在R命令行中輸入data<-datas命令
rc.assign("data",datas);
//執行R語句,相當於在R命令行中輸max(data)命令
REXP rexp=rc.eval("max(data)");
//REXP. asXxx()返回相應類型的數據,如果結果類型不符會出錯
System.out.println(rexp.asInteger());
rc.close();

    實例2:調用自定義函數

      創建R文件test.R
        myFunc<-function(data){
          x<-data+2;
        }

RConnection rc = new RConnection();
// test.R的路徑
String fileName = "D:\\test.R";
rc.assign("fileName", fileName);
//執行test.R腳本,執行這一步才能調用里面的自定義函數myFunc,如果不行,就在R工具上也執行一下test.R腳本
rc.eval("source(fileName)");
String num = "3";
//調用myFunc函數
REXP rexp=rc.eval("myFunc("+num+")");
//返回類型是一個整數類型,所以用asInteger
System.out.println(rexp.asInteger());
rc.close();

    在R-x.x.x\library\Rserve\client\java\Rserve\test目錄下有測試用例可以參考。(StartRserve.java是用java啟動Rserve服務,而不用打開R語言來手動啟動。test.java里包含了基本方法的調試)


   二、JRI(嵌入式模式)
      JRI,全名是Java/R Interface,是通過調用R的動態鏈接庫從而利用R中的函數等。通過install.packages("rJava")安裝rJava就行,在安裝文件夾中,可以看到一個jri的子文件夾,里面有自帶的例子可以用來測試。
      配置環境變量:在PATH中添加%R_HOME%/bin和%R_HOME%/library/rJava/jri,注意R_HOME的路徑要正確。
      安裝rJava
      install.packages("rJava")
      設置環境變量: PATH后添加 %R_HOME%\library\rJava\jri
      獲取jar包:把安裝目錄jri文件夾下的JRI.jar、REngine.jar和JRIEngine.jar放進Java工程添加到工程中。

    兩種方式優缺點比較:
    JRI(嵌入式模式)我體會到最大的優點是它對中文的支持較好,但是使用JRI模式下很容易造成整個系統的崩潰,比如在java調用R的時候,中間出現了異常或者錯誤,這些錯誤大致都是致命的,導致java虛擬機崩潰,從而導致整個系統崩潰
    Rserve(遠程通信模式) 在這種通信模式下,最大的優點是javaWeb項目不需要去維護R的運行,通過TCP/IP協議直接進行通訊,但是有一個很大的缺點是它對中文的支持很弱,尤其是在windows的環境中。基本是不支持中文的,在linux環境下,似乎對中文的支持稍微好些。不是完全支持中文的話,對返回有中文或者輸入有中文的系統將是不可用的。

 


免責聲明!

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



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