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);
		}
	}

}

 运行结果:

posted @ 2016-12-07 11:01  木头鸽子  阅读(6110)  评论(0编辑  收藏  举报