JAVA調用R腳本

0 前言
R是一種很是方便易用的繪圖、統計分析、ML算法設計方面的腳本語言。實際中有這樣一種場景:算法工程師用R搭建了機器學習算法模型,想用於javaweb之中可是又不想從新用java寫一遍算法模型,那麼能夠考慮java程序中直接調用R的腳本。JAVA負責系統的構建,R用來作運算引擎,從而實現應用型和分析性相結合的系統。
本文將搞清楚以下幾個問題:
1)java調用R的方式有哪些及每種方式如何使用?
2)這些調用方式的有哪些優缺點?
下面開始。java

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

1.1.1 Rserve的安裝、啓動、關閉方法
  方法一:
  準備工做:必須先安裝並配置了R語言,可去官網https://www.r-project.org下載安裝。
    在命令行窗口依次執行以下命令:
    每次啓動r虛擬機時:r
    第一次安裝Rserve包時: install.packages(「Rserve」)
    第一次加載Rserve包時:library(Rserve)
    每次須要啓動Rserve服務:Rserve()web

    關閉Rconnection鏈接:
    關閉Rconnection鏈接用rc.close();
  方法二:
  使用Rstudio軟件直接安裝Rserve的包。
  操做略。
  算法

1.1.2 自定義Rserve的配置文件
1)查看Rserve的help選項,Rserve包被安裝在R的安裝目錄的library文件夾下,命令以下圖所示。

2)查看Rserve的配置項

配置項含義:windows

config file: Rserv.cfg 配置文件名稱
working root: R運行時工做目錄 /tmp/Rserv
port: 6311 通訊端口
local socket: TCP/IP TCP/IP協議
authorization: 認證未開啓
plain text password: 不容許明文密碼
passwords file: 密碼文件,未指定
allow I/O: 容許IO操做
allow remote access: 遠程訪問未開啓
control commands: 命令控制未開啓
interactive: 容許通訊
max.input buffer size: 文件上傳限制262mb

3)新建自定義Rserve配置文件Rserv.cfg(可先建立Rserv.txt添加內容後改後綴爲cfg),該配置文件會覆蓋Rserve的默認配置,文件位置以下圖。

打開Rserv.cfg,其內容設置以下:服務器

workdir /tmp/Rserv
remote enable
fileio enable
interactive yes
port 6311
maxinbuf 262144
encoding utf8
control enable
source start.R
plaintext enable

該自定義配置項包含了一個Rserve啓動腳本start.R,該腳本可用於啓動Rserve時輸出提示信息,新建該腳本文件並輸入內容:機器學習

cat("This is my Rserve!")
print(paste("Rserve Server start at ",Sys.time()))

注:Rserve的服務器默認端口號是6311,固然用戶也能夠指定其餘端口號。socket

1.1.3 Rserve的使用方法
1) java項目調用Rserve須要三個jar文件:REngine.jar RserveEngine.jar Rserve.jar
經常使用類及方法以下:函數

Rconnection():鏈接R服務
eval():執行R語句,返回REXP類型數據
assgin():聲明變量
REXP類:其提供了asInteger(), asIntegers(), asString(), asDouble(), asDoubles(), asList()等方法將REXP類型數據轉換成java相應類型的數據
2) 測試代碼1,打印R版本信息:工具

package com.rTest;

import org.rosuda.REngine.REXP;
import org.rosuda.REngine.Rserve.RConnection;


public class Test {

public static void main(String[] args) {
RConnection rc = null
try {
rc = new RConnection();//創建與Rserve的鏈接
REXP x = c.eval("R.version.string");//執行R語句
System.out.println(x.asString());
} catch (Exception e) {
e.printStackTrace();
} finally{
rc.close();//關閉與Rserve的鏈接
}

}

}

3) 測試代碼2,調用R文件中自定義函數:
建立R文件test.R

   myFunc<-function(data){
     x<-data+2;
   }

java調用代碼以下:

package com.rTest;

import org.rosuda.REngine.REXP;
import org.rosuda.REngine.Rserve.RConnection;

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();//用完記得關閉鏈接

1.2 內嵌模式(使用JRI)
JRI,全名是Java/R Interface,是經過調用R的動態連接庫從而利用R中的函數等。經過install.packages(「rJava」)安裝rJava就行,在安裝文件夾中,能夠看到一個jri的子文件夾,裏面有自帶的例子能夠用來測試。

1)配置環境變量:在PATH中添加%R_HOME%/bin和%R_HOME%/library/rJava/jri,注意R_HOME的路徑要正確。
2)安裝rJava: install.packages(「rJava」)
3)設置環境變量:PATH後添加%R_HOME%\library\rJava\jri
4)獲取jar包:把安裝目錄jri文件夾下的JRI.jar、REngine.jar和JRIEngine.jar放進Java工程添加到工程中。
此模式只須要了解三個jar提供的API用法便可,再也不詳述。

2 兩種方式優缺點1)Rserve 優勢是javaWeb項目不須要去維護R的運行,經過TCP/IP協議直接進行通信。 缺點是它對中文的支持很弱,尤爲是在windows的環境中,基本不支持中文;在linux環境下,對中文的支持稍微好些。不是徹底支持中文的話,不能用於返回值有中文或者輸入有中文的系統。 2)JRI 優勢是對中文的支持較好。 缺點是使用JRI模式下很容易形成整個系統的崩潰,好比在java調用R的時候,中間出現了異常或者錯誤,致使java虛擬機崩潰,從而致使整個系統崩潰。

相關文章
相關標籤/搜索