Java調用R語言

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

  1、Rserve(遠程通訊模式)

  Rserve是一個基於TCP/IP的服務器,經過二進制協議傳輸數據,能夠提供遠程鏈接,使得客戶端語言可以調用R。
  Rserve做爲一個package發佈在CRAN上,能夠直接使用install.packages("Rserve")進行安裝。須要使用時在R控制檯下加載該包,而後輸入命令Rserve(),開啓服務器就能夠供客戶端調用。首先創建一個新的鏈接,而後就可使用eval之類的方法將R中的表達式傳到服務器端,經過R求值後傳回JAVA中REXP類型的變量,而後打印出來,整個過程很是簡單。因爲不須要對R進行初始化,所以速度會比較快。在其餘系統下能夠同時創建多個鏈接,可是在Windows下只容許同時打開一個鏈接,後續的鏈接都會共有相同的命名空間。
  linux

一、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配置:windows

<!--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裏包含了基本方法的調試)數組

   2、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工程添加到工程中。

兩種方式優缺點比較:
    maven

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