zoukankan      html  css  js  c++  java
  • JAVA调用R脚本

    0 前言
    R是一种非常方便易用的绘图、统计分析、ML算法设计方面的脚本语言。实际中有这样一种场景:算法工程师用R搭建了机器学习算法模型,想用于javaweb之中但是又不想重新用java写一遍算法模型,那么可以考虑java程序中直接调用R的脚本。JAVA负责系统的构建,R用来做运算引擎,从而实现应用型和分析性相结合的系统。
    本文将搞清楚如下几个问题:
    1)java调用R的方式有哪些及每种方式如何使用?
    2)这些调用方式的有哪些优缺点?
    下面开始。

    1 java调用R的两种方式
    1.1 远程调用模式(使用Rserve)
    Rserve是一个基于TCP/IP的服务器,通过二进制协议传输数据,可以提供远程连接,使得客户端语言能够调用R。
      Rserve作为一个package发布在CRAN上,在服务端计算机安装R之后可以直接使用install.packages(“Rserve”)进行安装。需要使用时在R控制台下加载该包,然后输入命令Rserve(),开启服务器就可以供客户端调用。
      首先建立一个新的连接,然后就可以使用eval之类的方法将R中的表达式传到服务器端,通过R求值后传回JAVA中REXP类型的变量,然后打印出来,整个过程非常简单。由于不需要对R进行初始化,因此速度会比较快。在linux等其他系统下可以同时建立多个连接,但是在Windows下只允许同时打开一个连接,后续的连接都会共有相同的命名空间。

    1.1.1 Rserve的安装、启动、关闭方法
      方法一:
      准备工作:必须先安装并配置了R语言,可去官网https://www.r-project.org下载安装。
        在命令行窗口依次执行如下命令:
        每次启动r虚拟机时:r
        第一次安装Rserve包时: install.packages(“Rserve”)
        第一次加载Rserve包时:library(Rserve)
        每次需要启动Rserve服务:Rserve()

        关闭Rconnection连接:
        关闭Rconnection连接用rc.close();
      方法二:
      使用Rstudio软件直接安装Rserve的包。
      操作略。
      

    1.1.2 自定义Rserve的配置文件
    1)查看Rserve的help选项,Rserve包被安装在R的安装目录的library文件夹下,命令如下图所示。

    2)查看Rserve的配置项

    配置项含义:

    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

    3)新建自定义Rserve配置文件Rserv.cfg(可先创建Rserv.txt添加内容后改后缀为cfg),该配置文件会覆盖Rserve的默认配置,文件位置如下图。

    打开Rserv.cfg,其内容设置如下:

    workdir /tmp/Rserv
    remote enable
    fileio enable
    interactive yes
    port 6311
    maxinbuf 262144
    encoding utf8
    control enable
    source start.R
    plaintext enable

    该自定义配置项包含了一个Rserve启动脚本start.R,该脚本可用于启动Rserve时输出提示信息,新建该脚本文件并输入内容:

    cat("This is my Rserve!")
    print(paste("Rserve Server start at ",Sys.time()))

    注:Rserve的服务器默认端口号是6311,当然用户也可以指定其他端口号。

    1.1.3 Rserve的使用方法
    1) java项目调用Rserve需要三个jar文件:REngine.jar RserveEngine.jar Rserve.jar
    常用类及方法如下:

    Rconnection():连接R服务
    eval():执行R语句,返回REXP类型数据
    assgin():声明变量
    REXP类:其提供了asInteger(), asIntegers(), asString(), asDouble(), asDoubles(), asList()等方法将REXP类型数据转换成java相应类型的数据
    2) 测试代码1,打印R版本信息:

    package com.rTest;

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


    public class Test {

    public static void main(String[] args) {
    RConnection rc = null
    try {
    rc = new RConnection();//建立与Rserve的连接
    REXP x = c.eval("R.version.string");//执行R语句
    System.out.println(x.asString());
    } catch (Exception e) {
    e.printStackTrace();
    } finally{
    rc.close();//关闭与Rserve的连接
    }

    }

    }

    3) 测试代码2,调用R文件中自定义函数:
    创建R文件test.R

       myFunc<-function(data){
         x<-data+2;
       }

    java调用代码如下:

    package com.rTest;

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

    RConnection rc = new RConnection();
    // test.R的路径
    String fileName = "D:\test.R";
    rc.assign("fileName", fileName);
    //执行test.R脚本,执行这一步才能调用里面的自定义函数myFunc,如果不行,就在R工具上也执行一下test.R脚本
    rc.eval("source(fileName)");
    String num = "3";
    //调用myFunc函数
    REXP rexp=rc.eval("myFunc("+num+")");
    //返回类型是一个整数类型,所以用asInteger
    System.out.println(rexp.asInteger());
    rc.close();//用完记得关闭连接

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

    1)配置环境变量:在PATH中添加%R_HOME%/bin和%R_HOME%/library/rJava/jri,注意R_HOME的路径要正确。
    2)安装rJava: install.packages(“rJava”)
    3)设置环境变量:PATH后添加%R_HOME%library Javajri
    4)获取jar包:把安装目录jri文件夹下的JRI.jar、REngine.jar和JRIEngine.jar放进Java工程添加到工程中。
    此模式只需要了解三个jar提供的API用法即可,不再详述。

    2 两种方式优缺点
    1)Rserve
    优点是javaWeb项目不需要去维护R的运行,通过TCP/IP协议直接进行通讯。
    缺点是它对中文的支持很弱,尤其是在windows的环境中,基本不支持中文;在linux环境下,对中文的支持稍微好些。不是完全支持中文的话,不能用于返回值有中文或者输入有中文的系统。
    2)JRI
    优点是对中文的支持较好。
    缺点是使用JRI模式下很容易造成整个系统的崩溃,比如在java调用R的时候,中间出现了异常或者错误,导致java虚拟机崩溃,从而导致整个系统崩溃。

    3 总结
    实际应用中推荐是Rserve,web系统与R的维护相对独立,增强了系统的灵活性和健壮性。
    ---------------------
    作者:StevenSun2014
    来源:CSDN
    原文:https://blog.csdn.net/tyhj_sf/article/details/81320731
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    React元素渲染
    初识JSX
    微信小程序复制文本到剪切板
    微信小程序报错request:fail url not in domain list
    小程序,通过自定义编译条件,模拟推荐人功能
    积分抵扣逻辑
    微信小程序 switch 样式
    tomcat 配置开启 APR 模式
    tomcat8 传输json 报错 Invalid character found in the request target. The valid characters are defined in RFC 3986
    c++数组初始化误区
  • 原文地址:https://www.cnblogs.com/CHWLearningNotes/p/10148451.html
Copyright © 2011-2022 走看看