本篇内容介绍了“Java程序怎么通过Rserve远程调用R”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! 本篇内容介绍了“Java程序怎么通过Rserve远程调用R”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
成都创新互联服务项目包括青海网站建设、青海网站制作、青海网页制作以及青海网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,青海网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到青海省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!
Rserve介绍
Rserve是一个基于TCP/IP协议的,允许R语言与其他语言通信的C/S结构的程序,支持C/C++,Java,PHP,Python,Ruby,Nodejs等。 Rserve提供远程连接,认证,文件传输等功能。我们可以设计R做为后台服务,处理统计建模,数据分析,绘图等的任务。
详细介绍请参照官方网站:https://rforge.net/Rserve/
Rserve安装
注意:安装Rserve前需要安装R,我安装的是 R-3.1.2-win.exe
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)一定要在dos窗口下进入该目录,不然以下命令不识别:
R CMD Rserve 注意:如果允许IP远程连接要使用 R CMD Rserve --RS-enable-remote
R将作出如下应答:
说明Rserve启动成功(端口6311),可以进行连接测试了。
注意:如果执行R CMD Rserve命令报错,说明R不认识此命令,需要配置R的环境变量,具体如下:
R_HOME R的安装目录(我的安装目录为: C:\Program Files\R\R-2.15.2)
path中添加
C:\Program Files\R\R-2.15.2\bin;
C:\Program Files\R\R-2.15.2\bin\x64
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"); //直接写IP如果报错,说明没有使用 R CMD Rserve --RS-enable-remote 的方式启动
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");//直接写IP如果报错,说明没有使用 R CMD Rserve --RS-enable-remote 的方式启动
// 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());
}
}
代码测试通过。