使用Rserve远程执行R脚本

  • 注1:关于Rserve网上有很多资料可以参考,详细情况可以参考博客下面的“参考资料”部分,本文只是简单介绍一下Rserve,主要目的是记录一下Java远程执行R脚本文件的方法。
  • 注2:这里提到的远程执行R脚本文件的方式都是R脚本存在于Rserve服务端,如果R脚本文件存在客户端,可以使用RUtils工具包:http://blog.csdn.net/zhyh1986/article/details/13065199


Rserve介绍


        Rserve是一个基于TCP/IP协议的,允许R语言与其他语言通信的C/S结构的程序,支持C/C++,Java,PHP,Python,Ruby,Nodejs等。 Rserve提供远程连接,认证,文件传输等功能。我们可以设计R做为后台服务,处理统计建模,数据分析,绘图等的任务。

        详细介绍请参照官方网站:https://rforge.net/Rserve/


Rserve安装


Linux系统下建议使用root权限安装。下面的内容是依据Windows7系统中安装过程进行描述的。

进入R语言解释器:R

安装命令:install.packages("Rserve")

然后安装程序会提示我们选择下载镜像,提示如下:

--- Please select a CRAN mirror for use in this session ---

等我们选择了镜像后(测试时选择的是China(xxx)),安装程序便进行下载安装,最终会输出如下的信息(Linux下的输出信息或有不同):


说明Rserve安装成功,安装路径为:%R_HOME%\library\Rserve目录。


启动Rserve服务


在Windows命令窗口进入R_HOME\library\Rserve\libs\i386目录中执行如下命令(我的Windows7是32位的,如果是64位系统对应目录为R_HOME\library\Rserve\libs\x64):

R CMD Rserve

R将作出如下应答:


说明Rserve启动成功(端口6311),可以进行连接测试了。

上面的启动命令使用的本地模式,如果想远程连接需要增加参数 –RS-enable-remote

即启动命令为:

R CMD Rserve --RS-enable-remote

Java远程连接Rserve


下载依赖jar包,地址:http://www.rforge.net/Rserve/files/
共两个jar包,下载完成后将它们加入到项目的classpath中即可:

  •  REngine.jar
  •  RserveEngine.jar

也可以到Rserve安装目录中寻找,比如:R_HOME \library\Rserve\java目录中就有相关jar包,名字略有不同,经测试可以使用:


简单的测试代码:

package com.zyh.up.general.rjava;

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

public class RserveBegin {
	public static void main(String[] args) {
		try {
			callRserve();
		} catch (RserveException e) {
			e.printStackTrace();
		} catch (REXPMismatchException e) {
			e.printStackTrace();
		}
	}
	
	static void callRserve() throws RserveException, REXPMismatchException {
		RConnection rConnection = new RConnection("192.168.101.122");
		
		String rv = rConnection.eval("R.version.string").asString();
		System.out.println(rv);
		
		double [] arr = rConnection.eval("rnorm(10)").asDoubles();
		for(double d : arr) {
			System.out.println(d);
		}
	}
}


测试可以通过,程序将输出R语言版本信息及10个Double类型的数字。

Java远程执行R脚本


上面的示例只是执行R命令,但如果我们在服务器上放置R脚本又该如何执行该脚本或调用其中的函数呢?

有两种方法可以完成上面的问题。

假如我们定义了一个R脚本area.R,其中定义了一个方法area,该方法接收一个半径值然后计算对应面积并返回,脚本内容非常简单:

area<-function(r){pi*r^2}

下面描述一下如何调用这个脚本中的area函数,并获取其返回值。

第一种方法就是直接用source函数将area.R脚本加载上来,然后就可以像调用R语言内置命令/函数一样调用脚本中的area方法了。这样做有一个缺点就是每建立一次Java与R之间的连接就需要调用source函数一次。
示例代码:

package com.zyh.up.general.rjava;

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

public class RserveBegin {
	public static void main(String[] args) {
		try {
			callRScript();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	static void callRScript() throws RserveException, REXPMismatchException {
		RConnection rc = new RConnection("192.168.101.122");
		// source函数需要给出R脚本路径, 注意传入转义的引号
		rc.eval("source(\"/home/hadoop/wangfeng/javaR/area.R\")");
		
		REXP rexp = rc.eval("area(10)");
		System.out.println("Area of 10 is " + rexp.asDouble());
	}
}

代码测试通过。

另一种调用R脚本的方法是通过Rserv.conf配置文件,该文件路径为/etc/Rserv.conf,如果文件不存在则创建一个新的,然后在文件中添加如下的代码:

source /home/hadoop/wangfeng/javaR/area.R

然后重新启动Rserve服务即可。

使用这种方式Java测试代码需要去掉source语句这一行,即:

rc.eval("source(\"/home/hadoop/wangfeng/javaR/area.R\")");

其它不变,经测试成功。

  • 注1:第二种方式只在Linux下采用,Win平台对应的方法没有找到。

另外:有些人说配置文件为Rserve.conf,但我在122的/etc下找到的是Rserv.conf,不管是哪一个文件(甚至两者都不是,随便命名一个),只要执行下面命令告诉Rserve配置文件是哪一个即可(需要重启Rserve):

R CMD Rserve --RS-conf Rserv.conf


参考资料




  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值