Rsession让Java调用R更简单
Rsession让Java调用R更简单
R的极客理想系列文章,涵盖了R的思想,使用,工具,创新等的一系列要点,以我个人的学习和体验去诠释R的强大。
R语言作为统计学一门语言,一直在小众领域闪耀着光芒。直到大数据的爆发,R语言变成了一门炙手可热的数据分析的利器。随着越来越多的工程背景的人的加入,R语言的社区在迅速扩大成长。现在已不仅仅是统计领域,教育,银行,电商,互联网….都在使用R语言。
要成为有理想的极客,我们不能停留在语法上,要掌握牢固的数学,概率,统计知识,同时还要有创新精神,把R语言发挥到各个领域。让我们一起动起来吧,开始R的极客理想。
关于作者:
- 张丹(Conan), 程序员Java,R,PHP,Javascript
- weibo:@Conan_Z
- blog: http://blog.fens.me
- email: bsspirit@gmail.com
转载请注明出处:
http://blog.fens.me/r-rserve-rsession/
前言
写了好几篇关于Rserve的文章了,Rserve作为R语言的通信接口,已经成为了R语言扩展的重要通道。大数据时代的到来,让原本小众的R语言,不经意间挤进了开发语言前20名。
同时,具有多种编程语言背景的IT工程师们,开始进入R的社区,帮助R语言快速进化。Rserve提供了一个通信的接口,通过封装可以让R引擎嵌入到其他语言里。
目录
- Rsession介绍
- Rsession下载
- 用Eclipse构建Rsession项目
- Rsession的API介绍
- Rserve服务器系统环境
- Rsession使用
1. Rsession介绍
Rsession提供了一种简单的方式,让Java可以访问远程或本地的Rserve实例。Rsession是对Rserve的封装,提供了更高层的API接口,包括Rserve服务器控制,多会话机制,并支持Windows环境。
另一个R和Java通信的库JRI,并不支持多会话机制。关于R和Java通信的其他文章,请参考:解惑rJava R与Java的高速通道, Rserve与Java的跨平台通信
Rsession项目主页:https://code.google.com/p/rsession/
2. Rsession下载
系统环境
- Win7 64bit
- R: 3.0.1 x86_64-w64-mingw32/x64 b4bit
发行包下载:解压缩就可以直接使用了
http://rsession.googlecode.com/files/libRsession.zip
包括3个jar包:REngine.jar, Rserve.jar, Rsession.jar
源代码下载:(SVN)
http://rsession.googlecode.com/svn/trunk/Rsession/
~ cd d:\workspace\java
~ svn checkout http://rsession.googlecode.com/svn/trunk/ rsession-read-only
~ mv rsession-read-only rsession
~ cd rsession\Rsession
项目是通过Ant构建的,我们可以自己编译,打包。
~ ant
Buildfile: d:\workspace\java\rsession\Rsession\build.xml
clean:
clean-dist:
init:
[mkdir] Created dir: d:\workspace\java\rsession\Rsession\build
[mkdir] Created dir: d:\workspace\java\rsession\Rsession\dist\lib
resource:
[copy] Copying 28 files to d:\workspace\java\rsession\Rsession\dist\lib
[copy] Copied 12 empty directories to 1 empty directory under d:\workspace\java\rsession\Rsession\dist\lib
compile:
[javac] d:\workspace\java\rsession\Rsession\build.xml:33: warning: 'includeantruntime' was not set, defaulting to bu
ild.sysclasspath=last; set to false for repeatable builds
[javac] Compiling 10 source files to d:\workspace\java\rsession\Rsession\build
dist:
[jar] Building jar: d:\workspace\java\rsession\Rsession\dist\lib\Rsession.jar
[zip] Building zip: d:\workspace\java\rsession\Rsession\dist\libRsession.zip
BUILD SUCCESSFUL
Total time: 2 seconds
在目录:d:\workspace\java\rsession\Rsession\dist\下面,生成发行包,libRsession.zip
3. 用Eclipse构建Rsession项目
用Eclipse构建Rsession项目,复制Rsession\dist\目录文件到项目,并加载到项目的环境变量。
4. Rsession的API介绍
查看类库:Rsession.jar
接口类
- BusyListener: Notify the state of R engine
- EvalListener: Notify the evaluation of R expression
- Logger: Support R messages printing
- UpdateObjectsListener: Notify the changing of R environment objects
功能类
- Rdaemon: RServe的守护进程
- RLogPanel: 显示R日志的空间
- RObjectsPanel: 显示R变量的控件
- RserverConf: 连接Rserve实例的配置文件
- Rsession: 连接Rserve实例
- StartRserve: 启动本地的Rserve
5. Rserve服务器系统环境
服务器系统环境
- Linux: Ubuntu 12.04.2 LTS 64bit
- R: 3.0.1 x86_64-pc-linux-gnu
- Rserve: Rserve v1.7-1
Rserve环境
- IP: 192.168.1.201,允许远程访问
- 端口: 6311
- 登陆认证: 用户名:conan, 密码:conan
- 字符编码: utf-8
Rserve服务器环境与文章中 Rserve的R语言客户端RSclient 配置相同。
6. Rsession使用
建立远程连接
RserverConf rconf = new RserverConf("192.168.1.201", 6311, "conan", "conan", new Properties());
Rsession s = Rsession.newInstanceTry(System.out, rconf);
执行R脚本
double[] rand = s.eval("rnorm(5)").asDoubles();
for(double ran:rand){
System.out.print(ran+",");
}
//日志输出
[eval] rnorm(5)
org.rosuda.REngine.REXPDouble@5f934ad[5]{0.08779203903807914,0.039929482749452114,-0.8788534039223883,-0.8875740206608903,-0.8493446334021442}
0.08779203903807914,0.039929482749452114,-0.8788534039223883,-0.8875740206608903,-0.8493446334021442
R创建对象并保存环境
// 创建一个R对象
s.set("demo", Math.random());
s.eval("ls()");
// 保存R环境到本地到文件
s.save(new File("./output/save.Rdata"), "demo");
// 删除R对象demo
s.rm("demo");
s.eval("ls()");
// 从文件加载R环境
s.load(new File("./output/save.Rdata"));
s.eval("ls()");
s.eval("print(demo)");
//日志输出
[set] demo
创建一个data.frame对象
s.set("df", new double[][] { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 }, { 10, 11, 12 } }, "x1", "x2", "x3");
double df$x1_3 = s.eval("df$x1[3]").asDouble();
System.out.println(df$x1_3);
s.rm("df");
//日志输出
[set] df
在本地生成一个图形文件
s.toJPEG(new File("./output/plot.png"), 400, 400, "plot(rnorm(10))");
//日志输出
[set] plotfile_1100539400
以HTML格式输出
String html = s.asHTML("summary(rnorm(100))");
System.out.println(html);
//日志输出
<html> Min. 1st Qu. Median Mean 3rd Qu. Max. <br/>-2.332000 -0.659900 0.036920 0.004485 0.665800 2.517000 </html>
以文本格式输出
String txt = s.asString("summary(rnorm(100))"); // format in text
System.out.println(txt);
//日志输出
Min. 1st Qu. Median Mean 3rd Qu. Max.
-3.19700 -0.65330 -0.09893 -0.07190 0.53300 2.29000
安装新类库
System.out.println(s.installPackage("sensitivity", true));
//日志输出
trying to load package sensitivity
package sensitivity is not installed.
package sensitivity not yet installed.
[eval] install.packages('sensitivity',repos='http://cran.cict.fr/',dependencies=TRUE)
org.rosuda.REngine.REXPNull@4d47c5fc
request package sensitivity install...
package sensitivity is not installed.
! package sensitivity installation failed.
Impossible to install package sensitivity !
查看完整的文件:RsessionDemo.java
~ vi RsessionDemo.java
package org.conan.r.rsession;
import java.io.File;
import java.util.Properties;
import org.math.R.RserverConf;
import org.math.R.Rsession;
import org.rosuda.REngine.REXPMismatchException;
public class RsessionDemo {
public static void main(String args[]) throws REXPMismatchException {
RserverConf rconf = new RserverConf("192.168.1.201", 6311, "conan", "conan", new Properties());
Rsession s = Rsession.newInstanceTry(System.out, rconf);
// 执行R脚本
double[] rand = s.eval("rnorm(5)").asDoubles();
System.out.println(rand);
// 创建一个R对象
s.set("demo", Math.random());
s.eval("ls()");
// 保存R运行时状态到文件
s.save(new File("./output/save.Rdata"), "demo");
// 删除R对象demo
s.rm("demo");
s.eval("ls()");
// 从文件加载R环境
s.load(new File("./output/save.Rdata"));
s.eval("ls()");
s.eval("print(demo)");
// 创建一个data.frame对象
s.set("df", new double[][] { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 }, { 10, 11, 12 } }, "x1", "x2", "x3");
double df$x1_3 = s.eval("df$x1[3]").asDouble();
System.out.println(df$x1_3);
s.rm("df");
// 生成一个图形文件
s.eval("getwd()");
s.toJPEG(new File("./output/plot.png"), 400, 400, "plot(rnorm(10))");
// 以HTML格式输出
String html = s.asHTML("summary(rnorm(100))");
System.out.println(html);
// 以文本格式输出
String txt = s.asString("summary(rnorm(100))");
System.out.println(txt);
// 安装新类库
System.out.println(s.installPackage("sensitivity", true));
s.end();
}
}
对比Rserve的JavaAPI(参考文章:Rserve与Java的跨平台通信),是不是感觉Rsession再友好呢!
我们在使用RStudio时,任务管理器中也可以看到rsession的进程!猜一下,RStudio也在使用rsession做程序接口。
动起手来,创造就在自己手中。
转载请注明出处:
http://blog.fens.me/r-rserve-rsession/
Rsession让Java调用R更简单的更多相关文章
- JAVA 调用 R 语言
1 简介 R是统计计算的强大工具,而JAVA是做应用系统的主流语言,两者天然具有整合的需要.关于整合,一方面,R中可以创建JAVA对象调用JAVA方法,另一方面,JAVA中可以转换R的数据类型调用R的 ...
- Java调用R语言
R是统计计算的强大工具,JAVA是做应用系统的主流语言.JAVA负责系统的构建,R用来做运算引擎,从而实现应用型和分析性相结合的系统. 一.Rserve(远程通信模式) Rserve是一个基于TCP/ ...
- Java 调用R 方法
JAVA 调用 R 语言 1 简介 R是统计计算的强大工具,而JAVA是做应用系统的主流语言,两者天然具有整合的需要.关于整合,一方面,R中可以创建JAVA对象调用JAVA方法,另一方面, ...
- JAVA调用R脚本
0 前言R是一种非常方便易用的绘图.统计分析.ML算法设计方面的脚本语言.实际中有这样一种场景:算法工程师用R搭建了机器学习算法模型,想用于javaweb之中但是又不想重新用java写一遍算法模型,那 ...
- JAVA 调用 R 语言之升华篇
由于项目的需要,最近做了一个javaWeb调用R的组件,在这里,我把自己走的一些弯路给大家总结一下: 一.选取什么插件作为java和R之间的通信? 1. 在传统的方式中,大致可以分为两类:一类是JRI ...
- Java调用R——rJava的安装和配置
rJava是Java通过JRI调用R所要安装的包.配置起来比较麻烦,我参考网上进行配置,使用rJava包中example里面的示例测试,控制台显示: Cannot find JRI native li ...
- JAVA调用R
JAVA很适合开发应用系统,但是数学建模和计算能力非其所长,如果该系统需要进行大量的统计或者优化的计算,调用R是一种很好的方式.JAVA负责系统的构建,R用来做运算引擎,从而实现应用型和分析性相结合的 ...
- Rserve, java调用R源文件
Rserve安装和加载: install.packages("Rserve") library("Rserve") Rserve() java调用: REn ...
- Java调用R(一)_Rserve
最近做项目涉及到R总结一些Java本地调用R和Java web项目中调用R的基本步骤 1. R中安装Rserve包 2. 系统变量Path加上 C:\Program Files\R\R-3.0.1 ...
随机推荐
- js-JavaScript高级程序设计学习笔记7
第十一章 DOM扩展 1.对DOM的两个主要的扩展是Selectors API(选择符API)和HTML5. 2.jQuery的核心就是通过CSS选择符查询DOM文档取得元素的引用,从而抛开了getE ...
- macOS安装「oh my zsh」
目前常用的 Linux 系统和 OS X 系统的默认 Shell 都是 bash,但是真正强大的 Shell 是深藏不露的 zsh, 这货绝对是马车中的跑车,跑车中的飞行车,史称『终极 Shell』, ...
- Jenkins实现生产环境部署文件的回滚操作(Windows)
由于dotnet项目的生产环境环境部署工具比较少,所以我使用jenkins作为生产环境的自动化部署工具. 既然有回滚操作,那么就会有部署操作:要实现回滚,先要实现部署的操作,我在jenkins搭建了一 ...
- mplayer依赖关系不满足
mplayer以及其他fork出来的如mplayer2是命令行下的媒体播放器.一般ubuntu等的桌面系统都自带.然而自己使用了一段时间后突然出现缺少库文件,各种依赖关系不满足也未能重新安装.为了以后 ...
- Android成长日记-Noification实现状态栏通知
Notification可以作为状态栏的通知,实现这个效果需要使用NotificationManager实现控制类,才能实现对这个效果的显示 下面是实现状态栏显示效果的通知: 1. 首先在Layout ...
- Android成长日记-Android布局优化
Android常用布局 1. LinearLayout(线性布局) 2. RelativeLayout(相对布局) 3. TableLayout(表格布局) 4. AbsoluteLayou(绝对布局 ...
- ubantu eclipe
sudo tar zxvf '/tmp/eclipse-inst-linux64.tar.gz' -C/usr/lib 4.在终端输入: $ sudo gedit /usr/share/applica ...
- MOOCULUS微积分-2: 数列与级数学习笔记 7. Taylor series
此课程(MOOCULUS-2 "Sequences and Series")由Ohio State University于2014年在Coursera平台讲授. PDF格式教材下载 ...
- Response 对象
Response 对象用于将数据从服务器发送回浏览器. 页面跳转并传递参数 Response.Redirect("~/welcome.aspx?parameter1=one¶ ...
- Sublime Text以及Package Control安装方法
官方下载:Sublime Text 中国论坛:Sublime 论坛 Sublime Text 是一个代码编辑器,具有漂亮的用户界面和强大的功能,并且它还是一个跨平台的编辑器,同时支持Windows.L ...