文档章节

Java程序通过Rserve远程调用R

 天涯无痕
发布于 2016/04/11 15:03
字数 1038
阅读 72
收藏 0

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窗口下进入该目录,不然以下命令不识别

  1. 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,该方法接收一个半径值然后计算对应面积并返回,脚本内容非常简单:

  1. 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());  

    }  

}  

代码测试通过。

本文转载自:

粉丝 0
博文 18
码字总数 4238
作品 0
南京
私信 提问
Rserve与Java的跨平台通信

R的极客理想系列文章,涵盖了R的思想,使用,工具,创新等的一系列要点,以我个人的学习和体验去诠释R的强大。 R语言作为统计学一门语言,一直在小众领域闪耀着光芒。直到大数据的爆发,R语言...

zh119893
2014/04/20
1K
2
Rsession让Java调用R更简单

R语言作为统计学一门语言,一直在小众领域闪耀着光芒。直到大数据的爆发,R语言变成了一门炙手可热的数据分析的利器。随着越来越多的工程背景的人的加入,R语言的社区在迅速扩大成长。现在已...

zh119893
2014/05/04
1K
4
在Java中使用Rserve调用R

昨天跟老师一起讨论之后得到了新的任务,讨论没得到什么结果,又收到了新的学习任务——在Java中调用R使用Rserve。 先介绍一下R R是一个用于统计计算和统计制图的优秀工具。其功能包括:数据...

zh119893
2014/05/14
1K
0
Rserve的R语言客户端RSclient

R语言作为统计学一门语言,一直在小众领域闪耀着光芒。直到大数据的爆发,R语言变成了一门炙手可热的数据分析的利器。随着越来越多的工程背景的人的加入,R语言的社区在迅速扩大成长。现在已...

zh119893
2014/05/04
731
1
How to Integrate R With Java Using Rserve

R Tutorial: How to Integrate R With Java Using Rserve http://codophile.com/2015/05/02/how-to-integrate-r-with-java-using-rserve/ IntroductionBuilding Machine Learning based anal......

qwfys
2018/07/26
63
0

没有更多内容

加载失败,请刷新页面

加载更多

nginx学习笔记

中间件位于客户机/ 服务器的操作系统之上,管理计算机资源和网络通讯。 是连接两个独立应用程序或独立系统的软件。 web请求通过中间件可以直接调用操作系统,也可以经过中间件把请求分发到多...

码农实战
今天
5
0
Spring Security 实战干货:玩转自定义登录

1. 前言 前面的关于 Spring Security 相关的文章只是一个预热。为了接下来更好的实战,如果你错过了请从 Spring Security 实战系列 开始。安全访问的第一步就是认证(Authentication),认证...

码农小胖哥
今天
11
0
JAVA 实现雪花算法生成唯一订单号工具类

import lombok.SneakyThrows;import lombok.extern.slf4j.Slf4j;import java.util.Calendar;/** * Default distributed primary key generator. * * <p> * Use snowflake......

huangkejie
昨天
12
0
PhotoShop 色调:RGB/CMYK 颜色模式

一·、 RGB : 三原色:红绿蓝 1.通道:通道中的红绿蓝通道分别对应的是红绿蓝三种原色(RGB)的显示范围 1.差值模式能模拟三种原色叠加之后的效果 2.添加-颜色曲线:调整图像RGB颜色----R色增强...

东方墨天
昨天
11
1
将博客搬至CSDN

将博客搬至CSDN

算法与编程之美
昨天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部