Rserve 實現java與R的互通


服務器端:     華為彈性雲服務器    服務系統:WindowsServer 2012 64bit   Rserve默認端口:6311

(華為雲服務器需要在網絡安全組設置入方向規則並指定端口)   

               java項目所用jar包    REngine.jar    RserveEngine.jar   Rserve.jar

一、下載安裝R

https://www.r-project.org/

二、設置系統環境變量

1、  下載安裝以后,設置R相關的環境變量,本機安裝(D:\R\R-3.3.2)

R_HOME   值為:D:\R\R-3.3.2

path  末尾添加 D:\R\R-3.3.2\bin;


配置完成后運行CMD  輸入   R   出現如下則R環境配置成功

三、安裝並載入Rserve

在R中運行  

>install.packages("Rserve")

>library(Rserve)

四、啟動Rserve服務
將Rserve安裝目錄D:\R\R-3.3.2\library\Rserve\libs\x64下三個文件拷到D:\R\R-3.3.2\library\Rserve\libs\x64下

方法1、在R中啟動Rserve  直接使用Rserve()函數。

>library(Rserve)

>Rserve()

Starting Rserve..

"D:\R\R-3.3.2\library\Rserve\libs\x64\Rserve.exe"

方法2、在“D:\R\R-3.3.2\library\Rserve\libs\x64”目錄下運行CMD  輸入命令 R CMD Rserve --help  出現下圖說明Rserve可以啟動

輸入R CMD Rserve 成功啟動

需要遠程連接需要輸入 R CMD Rserve --RS-enable-remote

 

五、Rserve的遠程配置

查看Rserve配置

CMD下輸入  R CMD Rserve --RS-settings  出現如下圖

    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

 新建txt文本 內容如下

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

 另存為名稱為Rserv后綴名為.cfg的Rserv   Rserv.cfg

上述信息包含了一個start.R腳本。新建R腳本輸入

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

 保存並將文件放到該目錄下(此腳本用於提示Rserve啟動成功)

 

建立java工程 導入三個jar包添加到構建路徑

DEMO:

package com.shengtian.test;

import org.rosuda.REngine.REXPMismatchException;
import org.rosuda.REngine.Rserve.RConnection;
import org.rosuda.REngine.Rserve.RserveException;

public class TestRserve {

	public static void main(String[] args) {
		try
		{
			TestRserve tr = new TestRserve();
			tr.callRserve();
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
	}
	
	public void callRserve() throws RserveException,REXPMismatchException
	{
		RConnection rcon = new RConnection("114.115.205.210");    //建立遠程鏈接
		String rv = rcon.eval("R.version.string").asString();     //得到R版本信息
		double[] arr = rcon.eval("rnorm(10)").asDoubles();        //通過R得到10個隨機數返回數組
		System.out.println(rv);                                   //輸出版本信息
		for(double x:arr)                                         //遍歷集合
		{
			System.out.println(x);
		}
	}

}

 運行結果:


免責聲明!

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



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