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
1
2
3
4
5
6
7
8
9
10
11
12
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
1
2
3
4
5
6
7
8
9
10
该自定义配置项包含了一个Rserve启动脚本start.R,该脚本可用于启动Rserve时输出提示信息,新建该脚本文件并输入内容:

cat("This is my Rserve!")
print(paste("Rserve Server start at ",Sys.time()))
1
2
注: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的连接
}

}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
3) 测试代码2,调用R文件中自定义函数:
创建R文件test.R

   myFunc<-function(data){
     x<-data+2;
   }
1
2
3
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
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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\rJava\jri
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
版权声明:本文为博主原创文章,转载请附上博文链接!

原文地址:https://www.cnblogs.com/CHWLearningNotes/p/10148451.html

时间: 2024-10-12 09:50:35

JAVA调用R脚本的相关文章

JAVA调用R脚本 windwos路径下

RConnection c = new RConnection();// REXP x = c.eval("source('D:\\\\jiaoben\\\\RJava_test.R',encoding = \"UTF-8\")"); REXP x = c.eval("source('D:\\\\jiaoben\\\\Rjava_testx6.R',encoding = \"UTF-8\")");// REXP eval =

Rsession让Java调用R更简单

Rsession让Java调用R更简单 R的极客理想系列文章,涵盖了R的思想,使用,工具,创新等的一系列要点,以我个人的学习和体验去诠释R的强大. R语言作为统计学一门语言,一直在小众领域闪耀着光芒.直到大数据的爆发,R语言变成了一门炙手可热的数据分析的利器.随着越来越多的工程背景的人的加入,R语言的社区在迅速扩大成长.现在已不仅仅是统计领域,教育,银行,电商,互联网….都在使用R语言. 要成为有理想的极客,我们不能停留在语法上,要掌握牢固的数学,概率,统计知识,同时还要有创新精神,把R语言发挥

Java调用R语言

R是统计计算的强大工具,JAVA是做应用系统的主流语言.JAVA负责系统的构建,R用来做运算引擎,从而实现应用型和分析性相结合的系统. 一.Rserve(远程通信模式) Rserve是一个基于TCP/IP的服务器,通过二进制协议传输数据,可以提供远程连接,使得客户端语言能够调用R. Rserve作为一个package发布在CRAN上,可以直接使用install.packages("Rserve")进行安装.需要使用时在R控制台下加载该包,然后输入命令Rserve(),开启服务器就可以供

java调用autoit3脚本

selenium无法对窗口进行操作,此时需要借助autoit. 必备软件: autoit3 如果不会编写也没有关系,可以用Au3Record直接录制,Au3Record直接就在autoit3的安装路径(path0)下 步骤: 1.用Au3Record录制.au3文件.(保存路径path1) 2.调用Runtime.getRuntime().exec(“path0  path1”):完成了java调用autoit3脚本. java调用autoit3脚本,布布扣,bubuko.com

java调用R

环境:win7 32位  jdk1.7  R 2.15.0   java调用r主要有三种方式,rJava,rServer还有rCaller,这边主要讲用rJava调用 rJava是一个R语言和Java语言的通信接口,通过底层JNI实现调用,允许在R中直接调用Java的对象和方法.由于rJava是底层接口,并使用JNI作为接口调用,所以效率非常高.在JRI的方案中,JVM直接通过内存直接加载RVM,调用过程性能几乎无损耗,因此是非常高效连接通道,是R和Java通信的首选开发包. 之前用R3.0.2

Java 调用 shell 脚本详解

这一年的项目中,有大量的场景需要Java 进程调用 Linux的bash shell 脚本实现相关功能. 从之前的项目中拷贝的相关模块和网上的例子来看,有个别的"陷阱"造成调用shell 脚本在某些特殊的场景下,有一些奇奇怪怪的bug. 大家且听我一一道来. 先看看网上搜索到的例子: [java] view plain copy package someTest; import java.io.BufferedReader; import java.io.IOException; im

(转)java调用python脚本

这篇博客旨在吐血分享今天遇到的java调用python脚本遇到的坑,折腾了3个多小时终于可以跑通了,代码超级短,但网上的好多资料都是抄来抄去的,很少有能够直接跑通的,尤其是针对你的python文件中用到第三方类库的情况. 先来说说我为什么要用java调用python代码,原因就在于python在爬虫方面提供了丰富的类库,但我本来已经有一套java操作数据库以及消息中间件的代码,这些代码用python实现的话可能需要至少一周时间,为了减少时间成本,因此我决定用java调用python脚本的方式使用

java调用python脚本

常见的java调用python脚本方式 通过jython.jar提供的类库实现 (不建议使用,因为会报module没有找到的错误,总之就是很蛋疼,要设置一系列的参数) 通过Runtime.getRuntime()开启进程来执行脚本文件(建议使用,原因:简单粗暴我喜欢!!!)在这个里面注意:调用py脚本的时候,先用windows的dos界面去运行下 命令: python xxxx.py,测试,脚本可以调用,不然可能在java脚本就是调用了,但是就是失败了的情况,导致一直卡住,本人就是这样的一个情况

Java调用R(二)_JRI(转)

基本步骤 1.  R中需要安装rJava包. 2.  系统变量Path加上 C:\Program Files\R\R-3.0.1\bin\i386;C:\Program Files\R\R-3.0.1\library\rJava\jri 系统变量Classpath加上: C:\Program Files\R\R-3.0.1\library\rJava\jri\JRI.jar 3.  项目中加入JRI.jar, JRIEngine.jar, REngine.jar 4.  将rJava自带的测试实