Java通过Rserve调用R脚本

JAVA负责系统的构建,R用来做运算引擎,从而实现应用型和分析性相结合的系统。增强了系统的灵活性和健壮性。

一、方式介绍

1.1内嵌模式(使用JRI)

JRI,全名是Java/R Interface,是通过调用R的动态链接库从而利用R中的函数等。通过install.packages(“rJava”)安装rJava就行,在安装文件夹中,可以看到一个jri的子文件夹,里面有自带的例子可以用来测试。过程:

  1. 配置JRI环境变量

  2. 安装rJava。 install.packages(“rJava”)

  3. 导入jar包。JRI.jar、REngine.jar和JRIEngine.jar

1.2远程调用模式(使用Rserve)

Rserve是一个基于TCP/IP的服务器,通过二进制协议传输数据,可以提供远程连接,使得客户端语言能够调用R。在服务端计算机安装R之后可以直接使用install.packages(“Rserve”)进行安装。需要使用时在R控制台下加载该包,然后输入命令Rserve(),开启服务器就可以供客户端调用。过程:

  1. 安装并配置了R语言>>
  2. 安装Rserve包: install.packages(“Rserve”)
  3. 自定义Rserve的配置文件。Rserve包被安装在R的安装目录的library文件夹下

配置项含义:

        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

新建自定义Rserve配置文件Rserv.cfg(可先创建Rserv.txt添加内容后改后缀为cfg),该配置文件会覆盖Rserve的默认配置,该自定义配置项包含了一个Rserve启动脚本start.R,该脚本可用于启动Rserve时输出提示信息,新建该脚本文件并输入内容:

        cat("This is my Rserve!")

        print(paste("Rserve Server start at ",Sys.time()))

  1. 加载Rserve包:library(Rserve)
  2. 导入jar包REngine.jar RserveEngine.jar Rserve.jar
  3. Rconnection():连接R服务
  4. eval():执行R语句,返回REXP类型数据(其提供了asInteger(), asIntegers(), asString(), asDouble(), asDoubles(), asList()等方法将REXP类型数据转换成java相应类型的数据)
  5. assgin():声明变量
  6. 关闭Rconnection连接用rc.close();

1.3对比

Rserve

优点是javaWeb项目不需要去维护R的运行,通过TCP/IP协议直接进行通讯。

缺点是它对中文的支持很弱,尤其是在windows的环境中,基本不支持中文;在linux环境下,对中文的支持稍微好些。不是完全支持中文的话,不能用于返回值有中文或者输入有中文的系统。

JRI

优点是对中文的支持较好。

缺点是使用JRI模式下很容易造成整个系统的崩溃,比如在java调用R的时候,中间出现了异常或者错误,导致java虚拟机崩溃,从而导致整个系统崩溃。

二、Rserve

2.1下载地址

CRAN - Package Rserve

install.packages("Rserve", repos = "https://mirror.lzu.edu.cn/CRAN/")


# 以服务方式启动Rserve,供Java调用,默认端口号6311,日志输出文件R.out,后台启动
 R CMD Rserve --RS-enable-remote --no-save> R.out 2>&1 &

Java通过Rserve调用R脚本_第1张图片

2.2引入依赖 


    org.rosuda.REngine
    Rserve
    1.8.1



    org.rosuda.REngine
    REngine
    2.1.0

 【路径不要出现中文】

 三、tidyverse包

install.packages("tidyverse", dependencies = TRUE) 

报错

Java通过Rserve调用R脚本_第2张图片

 解决方法:在这个目录下找到***readxl,然后删除它,重新install一下就行。可能是之前install的时候没有下载完就强制断开了。


library("tidyverse")

Java通过Rserve调用R脚本_第3张图片


 capabilities()

Java通过Rserve调用R脚本_第4张图片

 发现linux不支持这三种图片格式的画图板。


./configure --enable-R-shlib --prefix=/etc/R  --with-readline=no --with-libpng --with-jpeglib

红字是不是很熟悉。

四、Java代码

RConnection rConnection = new RConnection("127.0.0.1", 6311);
        REXP rexp = rConnection.eval("R.version.string");//测试连接,方法是eval(String arg0)
        System.out.println(rexp.asString());// R version 3.1.2 (2014-10-31)
        // 服务器中R语言脚本路径
        String fileName = "D:/WorkSpace/R/template.R";
        // 指定要执行的R语言脚本,需要先指定脚本
        rConnection.assign("fileName", fileName);
        // 向脚本中进行参数传递,只需要和脚本中的参数名称保持一致即可
        rConnection.eval("myplot('data.csv','oo.pdf')");
        // 执行
        rConnection.eval("source(fileName)");
        rConnection.close();

大功告成!

你可能感兴趣的:(R,java,r语言)