• Posts tagged "Rserve"

Blog Archives

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/

rsession

前言

写了好几篇关于Rserve的文章了,Rserve作为R语言的通信接口,已经成为了R语言扩展的重要通道。大数据时代的到来,让原本小众的R语言,不经意间挤进了开发语言前20名。

同时,具有多种编程语言背景的IT工程师们,开始进入R的社区,帮助R语言快速进化。Rserve提供了一个通信的接口,通过封装可以让R引擎嵌入到其他语言里。

目录

  1. Rsession介绍
  2. Rsession下载
  3. 用Eclipse构建Rsession项目
  4. Rsession的API介绍
  5. Rserve服务器系统环境
  6. 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\目录文件到项目,并加载到项目的环境变量。

rsession-eclipse

4. Rsession的API介绍

查看类库:Rsession.jar

rsession-api

接口类

  • 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 

plot

以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做程序接口。

rsession-process

动起手来,创造就在自己手中。

转载请注明出处:
http://blog.fens.me/r-rserve-rsession/

打赏作者

Rserve的R语言客户端RSclient

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-rsclient/

rsclient-rserve

前言

RSclient是实现Rserve通信的R语言客户端程序,对于统计人员使用RSclient调用Rserve运行R语言脚本,感觉会很奇怪。但对于实际应用架构来说却是很有帮助的,不仅可以统一Rserve的接口,还可以从架构上实现R语言的跨虚拟机的分步式程序设计。

目录

  1. Rserve和RSclient介绍
  2. Rserve系统环境
  3. RSclient安装
  4. RSclient的API
  5. RSclient使用
  6. 两个客户端同时访问

1. Rserve和RSclient介绍

Rserve介绍

Rserve是一个基于TCP/IP协议的,允许R语言与其他语言通信的C/S结构的程序,支持C/C++,Java,PHP,Python,Ruby,Nodejs等。 Rserve提供远程连接,认证,文件传输等功能。我们可以设计R做为后台服务,处理统计建模,数据分析,绘图等的任务。

Rserve的使用请参考文章:R语言服务器程序 Rserve详解, Rserve与Java的跨平台通信

RSclient介绍

RSclient是Rserve客户端的R语言实现,通过RSclient可以访问Rserve服务器实例。

官方介绍:http://www.rforge.net/RSclient/

2. Rserve系统环境

服务器系统环境

  • Linux: Ubuntu 12.04.2 LTS 64bit
  • R: 3.0.1 x86_64-pc-linux-gnu
  • Rserve: Rserve v1.7-1

启动Rserve服务器


~ R CMD Rserve

~ ps -aux|grep Rserve
conan    28339  0.0  1.2 116292 25240 ?        Ss   22:31   0:00 /usr/lib/R/bin/Rserve

~ netstat -ntlp|grep Rserve
tcp        0      0 0.0.0.0:6311            0.0.0.0:*               LISTEN      28339/Rserve

Rserve环境

  • IP: 192.168.1.201,允许远程访问
  • 端口: 6311
  • 登陆认证: 用户名:conan, 密码:conan
  • 字符编码: utf-8

~ R CMD Rserve --RS-settings
Rserve v1.7-1

config file: /etc/Rserv.conf
working root: /tmp/Rserv
port: 6311
local socket: [none, TCP/IP used]
authorization required: yes
plain text password: allowed
passwords file: [none]
allow I/O: yes
allow remote access: yes
control commands: yes
interactive: yes
max.input buffer size: 262144 kB

3. RSclient安装

客户端环境,远程访问

  • Win7 64bit
  • R: 3.0.1 x86_64-w64-mingw32/x64 b4bit

RSclient安装和加载


~ R

> install.packages("RSclient")
> library(RSclient)

4. RSclient的API

RSclient的API分为两组,Rclient(旧版本)和RCC(新版本)。

Rclient 旧版本API:函数名是大小写连写的

RSassign           RSattach           RSclose
RSconnect          RSdetach           RSeval             RSevalDetach
RShowDoc           RSiteSearch        RSlogin            RSserverEval
RSserverSource     RSshutdown         RSclient::

RCC 新版本API:函数名以.分隔的

RS.assign          RS.authkey         RS.close           RS.collect
RS.connect         RS.eval            RS.eval.qap        RS.login
RS.oobCallbacks    RS.server.eval     RS.server.shutdown RS.server.source
RS.switch

我主要介绍新版本API的使用

客户端操作函数

  • RS.connect: 创建与Rserve的连接
  • RS.close: 关闭与Rserve的连接
  • RS.login: 登陆认证
  • RS.authkey: 设置认证时加密算法
  • RS.eval: 在Rserve远程执行R语句
  • RS.eval.qap: 远程执行R语句,使用Rserve QAP序列化对象代替本地对象
  • RS.collect: 等待异步执行的eval的结果,一起返回
  • RS.assign: 远程执行赋值
  • RS.switch: 协议转换,从QAP1到TLS QAP1
  • RS.oobCallbacks: 回调函数, 通过OOB_SEND函数和OOB_MSG函数中执行

服务器管理函数:Rserve启动时,需要设置–RS-enable-control

  • RS.server.eval: 服务器控制函数,执行脚步
  • RS.server.shutdown: 服务器控制函数,关闭服务器
  • RS.server.source: 服务器控制函数,执行服务器端本地文件

5. RSclient的使用


~ R
> library(RSclient)

#建立连接
> conn<-RS.connect(host="192.168.1.201")
> conn
 Rserve QAP1 connection 0x000000000445cd60 (socket 308, queue length 0)

#登陆认证
> RS.login(conn,"conan","conan",authkey=RS.authkey(conn))
[1] TRUE

#执行脚本
> RS.eval(conn,rnorm(5))
[1] -2.6762608  1.4435144 -0.4298395 -0.7046573 -1.4056073

#设置变量
> RS.assign(conn,"xx",99)
raw(0)
> RS.eval(conn,xx-55)
[1] 44

#同步执行
> RS.eval(conn,head(rnorm(10000000)),wait=TRUE)
[1] -4.20217390  0.22353317 -1.70256992  0.30053213 -0.01427486 -0.70522254

#异步执行
> RS.eval(conn,head(rnorm(10000000)),wait=FALSE)
NULL
> RS.collect(conn)
[1] -0.2814752  0.3215521 -1.0978825 -0.8534461 -0.2459560 -0.4804882

#关闭连接
> RS.close(conn)
NULL
> conn
 Closed Rserve connection 0x000000000445cc80

6. 两个客户端同时访问

客户端A


~ R 
library(RSclient)
conn<-RS.connect(host="192.168.1.201")
RS.login(conn,"conan","conan",authkey=RS.authkey(conn))
RS.assign(conn,"A",1234)

> RS.eval(conn,A)
[1] 1234

> RS.eval(conn,getwd())
[1] "/tmp/Rserv/conn29039"

客户端B


~ R 
library(RSclient)
conn<-RS.connect(host="192.168.1.201")
RS.login(conn,"conan","conan",authkey=RS.authkey(conn))
RS.assign(conn,"B",5678)

> RS.eval(conn,B)
[1] 5678
> RS.eval(conn,ls())
[1] "B"
> RS.eval(conn,getwd())
[1] "/tmp/Rserv/conn29040"

我们看到A,B两个客户端建立接口后,服务器端的Rserve会在两个单独的空间运行。因此,A,B两个客户端的访问是独立的。

在客户端A,设置服务器全局变量


> RS.server.eval(conn, "G<-999") :
  command failed with status code 0x48: access denied

注:出现拒绝访问的错误,虽然我们已经打开了--RS-enable-control,还是有错误,不知道是不是Rserve的bug。

通过RSclient,我们就可以远程连接Rserve。如果大家发散一下想法,就可以通过Rserve和RSclient构建一个纯R的分步式计算环境。下篇文章我将模拟构建一个这样的环境!!

转载请注明出处:
http://blog.fens.me/r-rserve-rsclient/

打赏作者

R语言服务器程序 Rserve详解

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-server/

rserve-server

前言

Rserve作为一个R语言与其他语言的通信(TCP/IP)接口,被多个项目所依赖。Rserve服务端配置和运行都非常简单,客户端由多种语言实现,像C/C++, Java等。R也有自己的客户端实现 RSclient 项目,将在下文介绍。

本文详细剖析Rserve作为服务器端应用的配置和使用。

目录

  1. Rserve介绍
  2. Rserve简单使用
  3. Rserve高级使用:配置管理
  4. Rserve高级使用:用户登陆认证

1. Rserve介绍

关于Rserve上次说的不够细,用到起来处处有坑。接下来,深入细节再学学。

上篇文章请参考:Rserve与Java的跨平台通信

Rserve介绍

Rserve是一个基于TCP/IP协议的,允许R语言与其他语言通信的C/S结构的程序,支持C/C++,Java,PHP,Python,Ruby,Nodejs等。 Rserve提供远程连接,认证,文件传输等功能。我们可以设计R做为后台服务,处理统计建模,数据分析,绘图等的任务。

官方介绍:http://www.rforge.net/Rserve/

2. Rserve简单使用

服务器系统环境

  • Linux: Ubuntu 12.04.2 LTS 64bit
  • R: 3.0.1 x86_64-pc-linux-gnu

Rserve安装和加载


~ R
> install.packages("Rserve")
> library(Rserve)

Rserve服务器

  • 1). 在程序中,启动Rserve服务器
  • 2). 在命令行,启动Rserve服务器

Rserve的函数,只有3个。

  • Rserve(): 单独启动一个守护进程作为Rserve实例。
  • run.Rserve(): 在当前的进程中,启动Rserve实例
  • self():

1). 在程序中,启动Rserve服务器


> library(Rserve)
> Rserve()
Starting Rserve:
 /usr/lib/R/bin/R CMD /home/conan/R/x86_64-pc-linux-gnu-library/3.0/Rserve/libs//Rserve


R version 3.0.1 (2013-05-16) -- "Good Sport"
Copyright (C) 2013 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu (64-bit)

R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.

  Natural language support but running in an English locale

R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.

Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.

Rserv started in daemon mode.

查看Rserv进程


~ ps -aux|grep Rserve
conan     8830  0.0  1.2 116336 25044 ?        Ss   06:46   0:00 /home/conan/R/x86_64-pc-linux-gnu-library/3.0/Rserve/libs//Rserve

~ netstat -nltp|grep Rserve
tcp        0      0 127.0.0.1:6311          0.0.0.0:*               LISTEN      8830/Rserve

2). 在命令行,启动Rserve服务器

Rserve命令帮助


~ R CMD Rserve --help
Usage: R CMD Rserve []

Options: --help  this help screen
 --version  prints Rserve version (also passed to R)
 --RS-port   listen on the specified TCP port
 --RS-socket   use specified local (unix) socket instead of TCP/IP.
 --RS-workdir   use specified working directory root for connections.
 --RS-encoding   set default server string encoding to .
 --RS-conf   load additional config file.
 --RS-settings  dumps current settings of the Rserve
 --RS-source   source the specified file on startup.
 --RS-enable-control  enable control commands
 --RS-enable-remote  enable remote connections

All other options are passed to the R engine.

在命令行启动Rserve


~ R CMD Rserve --RS-enable-remote

R version 3.0.1 (2013-05-16) -- "Good Sport"
Copyright (C) 2013 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu (64-bit)

R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.

  Natural language support but running in an English locale

R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.

Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.

Rserv started in daemon mode.

查看Rserv进程


~ ps -aux|grep Rserve
conan    27639  0.0  1.2 116288 25236 ?        Ss   20:41   0:00 /usr/lib/R/bin/Rserve --RS-enable-remote

~ netstat -nltp|grep Rserve
tcp        0      0 0.0.0.0:6311            0.0.0.0:*               LISTEN      27639/Rserve

3. Rserve高级使用:Rserve配置管理

通过配置文件,管理Rserve服务器。

  • Rserv.conf: 配置文件
  • source.R:初始化脚步文件

查看当前的Rserve 服务器的默认配置信息


~ R CMD Rserve --RS-settings
Rserve v1.7-1

config file: /etc/Rserv.conf
working root: /tmp/Rserv
port: 6311
local socket: [none, TCP/IP used]
authorization required: no
plain text password: not allowed
passwords file: [none]
allow I/O: yes
allow remote access: no
control commands: no
interactive: yes
max.input buffer size: 262144 kB
  • config file: 我本地无此文件/etc/Rserv.conf, 系统会默认跳过这项
  • working root: R运行时工作目录 /tmp/Rserv
  • port: 通信端口6311
  • local socket: TCP/IP协议
  • authorization: 认证未开启
  • plain text password: 不允许明文密码
  • passwords file: 密码文件,未指定
  • allow I/O: 允许IO操作
  • allow remote access: 远程访问未开启
  • control commands: 命令控制未开启
  • interactive: 允许通信
  • max.input buffer size: 文件上传限制262mb

修改默认配置,新建文件:/etc/Rserv.conf


~ sudo vi /etc/Rserv.conf

workdir /tmp/Rserv
remote enable
fileio enable
interactive yes
port 6311
maxinbuf 262144
encoding utf8
control enable
source /home/conan/R/RServe/source.R
eval xx=1

~ vi /home/conan/R/RServe/source.R

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

再次查看服务器配置


 R CMD Rserve --RS-settings
Rserve v1.7-1

config file: /etc/Rserv.conf
working root: /tmp/Rserv
port: 6311
local socket: [none, TCP/IP used]
authorization required: yes
plain text password: allowed
passwords file: [none]
allow I/O: yes
allow remote access: yes
control commands: yes
interactive: yes
max.input buffer size: 262144 kB
  • 允许远程访问
  • 需要登陆认证
  • 允许明文密码

启动服务器


~  R CMD Rserve

R version 3.0.1 (2013-05-16) -- "Good Sport"
Copyright (C) 2013 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu (64-bit)

R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.

  Natural language support but running in an English locale

R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.

Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.

This is my Rserve!![1] "Server start at 2013-10-30 22:38:10"
Rserv started in daemon mode.

查看日志:source.R在启动时候被执行。

"This is my Rserve!![1] "Server start at 2013-10-30 22:38:10""

source选项,用来配置Rserve服务器启动时加载的文件,例如:初始化系统变量,初始化系统函数等。
eval选项,直接定义环境变量。

查看进程


~ ps -aux|grep Rserve
conan    28339  0.0  1.2 116292 25240 ?        Ss   22:31   0:00 /usr/lib/R/bin/Rserve

~ netstat -ntlp|grep Rserve
tcp        0      0 0.0.0.0:6311            0.0.0.0:*               LISTEN      28339/Rserve

允许远程访问, 不限制IP

0 0.0.0.0:6311

4. Rserve高级使用:用户登陆认证

在本地环境,无认证情况下,使用RSclient访问Rserve。RSclient的使用,请参考文章:Rserve的R语言客户端RSclient


~ R

>  library(RSclient)
>  conn<-RS.connect()
>  RS.eval(conn,rnorm(10))
 [1]  0.03230305  0.95710725 -0.33416069 -0.37440009 -1.95515719 -0.22895924
 [7]  0.39591984  1.67898842 -0.01666688 -0.26877775

增加用户登陆认证,修改文件:/etc/Rserv.conf


~ sudo vi /etc/Rserv.conf

workdir /tmp/Rserv
remote enable
fileio enable
interactive yes
port 6311
maxinbuf 262144
encoding utf8
control enable
source /home/conan/R/RServe/source.R
eval xx=1
auth required
plaintext enable

使用RSclient访问,认证报错。


> library(RSclient)
> conn<-RS.connect()
> RS.eval(conn,rnorm(10))
Error in RS.eval(conn, rnorm(10)) :
  command failed with status code 0x41: authentication failed

用RSclient登陆


> library(RSclient)
> conn<-RS.connect()
> RS.login(conn,"conan","conan",authkey=RS.authkey(conn))
[1] TRUE
> RS.eval(conn,rnorm(5))
[1] -1.19827684  0.72164617  0.22225934  0.09901505 -1.54661436

这里用户登陆认证,是绑定的操作系统用户。我们还可以在Rserv.conf配置文件,指定uid,gid参数,从而更细粒度的控制服务器权限。

本文详细地介绍了Rserve的安装,配置,使用,以及Rserve支持的功能。有了知识积累,我们就可以利用Rserve,来构建企业级的上线应用了。

转载请注明出处:
http://blog.fens.me/r-rserve-server/

打赏作者

FastRWeb跑在Web上的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-fastrweb-rserve/

FastRWeb
前言

一直以来R语言都被用在,基于个人电脑的客户端程序上。我们习惯性的下载R安装包,在自己的电脑上面装好,写算法,运行。然后,以贴图或者文档的形式,发表自己的作品。

R如果可以运行在Server端,把结果以Web的方式发布!这才是互联网的工作方式!FastRWeb提供一种方式,可以实现B/S结构的R应用。

目录

  1. FastRWeb介绍
  2. FastRWeb架构原理
  3. FastRWeb安装
  4. FastRWeb使用

1. FastRWeb介绍

FastRWeb 是一个基础架构环境, 可以让R脚本运行在任何WebServer上,展示数据和图形。用户通过URL地址与R脚本进行通信交互。 FastRWeb 可以快速地构建一个R的Web环境,FastRWeb 底层依赖于CGI程序,也就是说,只要能支持CGI程序的WebServer,就可以运行FastRWeb。

本文以R语言的WebServer库Rserve为例,部署FastRWeb,实现R的Web应用。

官方发布页:http://www.rforge.net/FastRWeb/

2. FastRWeb架构原理

fastRweb-architect

  • 1. 浏览器通过http请求访问Web服务器
  • 2. Web服务器通过socket,把请求发给Rserve服务器
  • 3. Rserve调用FastRWeb环境,运行R的脚本,返回数据和图片
  • 4. 浏览器,得到结果,并在web上展示

3. FastRWeb安装

服务器系统环境

  • Linux: Ubuntu 12.04.2 LTS 64bit
  • R: 3.0.1 x86_64-pc-linux-gnu

FastRWeb安装


~ R
> install.packages("FastRWeb")
installing to /home/conan/R/x86_64-pc-linux-gnu-library/3.0/FastRWeb/libs
** R
** inst
** preparing package for lazy loading
** help
*** installing help indices
** building package indices
** testing if installed package can be loaded
* DONE (FastRWeb)

由于FastRWeb依赖于cairo库,Cairo安装会用到Linux本地库,请参考文章:R语言的高质量图形渲染库Cairo

安装Rserve


> install.packages("Rserve")

有关Rserve的介绍,请参考文章:Rserve与Java的跨平台通信

创建FastRWeb基于Rserve的运行环境


~ cd /home/conan/R/x86_64-pc-linux-gnu-library/3.0/FastRWeb

~ sudo ./install.sh
Done.
Please check files in /var/FastRWeb/code
If they match tour setup, you can start Rserve using
/var/FastRWeb/code/start

查看生成的目录:/var/FastRWeb/code/


~ cd /var/FastRWeb/code/

~ ls -l
-rw-r--r-- 1 conan conan 1210 Oct 29 16:07 README
-rw-r--r-- 1 conan conan   79 Oct 29 17:50 rserve.conf
-rw-r--r-- 1 conan conan 2169 Oct 29 17:51 rserve.R
-rwxr-xr-x 1 conan conan  457 Oct 29 17:35 start
  • README:帮助说明
  • rserve.conf:Rserve的启动参数
  • rserve.R:Rserve的启动脚本
  • start:启动命令

修改文件:rserve.conf


~ vi rserve.conf

http.port 8888
remote enable
source /var/FastRWeb/code/rserve.R
control enable

默认情况,rserve是提供socket通信接口,为了web测试方便,我们改成用http的通信接口。

修改文件:rserve.R, 在文件上的最上面增加2行代码。


~ vi rserve.R

library(FastRWeb)
.http.request <- FastRWeb:::.http.request

## 原文代码
## ...

这样我们就改好了,成http为通信接口。

4. FastRWeb使用

启动服务


~ sudo ./start

R CMD Rserve --RS-conf /var/FastRWeb/code/rserve.conf --vanilla --no-save --RS-enable-remote

R version 3.0.1 (2013-05-16) -- "Good Sport"
Copyright (C) 2013 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu (64-bit)

R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.

  Natural language support but running in an English locale

R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.

Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.

Starting Rserve on conan
Loading packages...
XML: TRUE
Cairo: TRUE
Matrix: TRUE
FastRWeb: TRUE
Rserv started in daemon mode.

从启动日志,我们看出XML, Cairo, Matrix, FastRWeb, Rserv几个包都加载了,正常运行。

查看系统进程和端口:


~ ps -aux|grep Rserve
conan    23739  0.0  1.4 120140 28916 ?        Ss   16:47   0:00 /usr/lib/R/bin/Rserve --RS-conf /var/FastRWeb/code/rserve.conf --vanilla --no-save --RS-enable-remote

~ sudo netstat -nltp|grep Rserve
tcp        0      0 0.0.0.0:8888            0.0.0.0:*               LISTEN      25778/Rserve
tcp        0      0 0.0.0.0:6311            0.0.0.0:*               LISTEN      25778/Rserve

有2个端口被打开了,一个是Rseve的socket端口6311,一个是http端口8888。

通过web进行访问:http://192.168.1.201:8888/example1.png

fastRweb-example1

这个图的R代码,实际对应的是文件:/var/FastRWeb/web.R/example1.png.R


~ vi /var/FastRWeb/web.R/example1.png.R

run <- function(...) {
  p <- WebPlot(600, 600)
  plot(rnorm(100), rnorm(100), pch = 19, col = 2)
  p
}

修改:/var/FastRWeb/web.R/example1.png.R


~ vi /var/FastRWeb/web.R/example1.png.R

run <- function(...) {
  p <- WebPlot(600, 600)
  plot(rnorm(400), rnorm(400), pch = 20, col = 3)
  p
}

在浏览器刷新页面:

fastRweb-example2

这样就实现了,通过web来执行R脚本,在web上画图。

在目录:/var/FastRWeb/web.R/,下面有几个例子,大家可以参考写自己的R语言脚本。


ls -l /var/FastRWeb/web.R
total 32
-rw-r--r-- 1 conan conan 790 Oct 29 16:07 common.R
-rw-r--r-- 1 conan conan 316 Oct 29 20:01 example1.png.R
-rw-r--r-- 1 conan conan 520 Oct 29 16:07 example2.R
-rw-r--r-- 1 conan conan 174 Oct 29 16:07 index.R
-rw-r--r-- 1 conan conan 215 Oct 29 16:07 info.R
-rw-r--r-- 1 conan conan  64 Oct 29 16:07 main.R
-rw-r--r-- 1 conan conan 167 Oct 29 16:07 README
-rw-r--r-- 1 conan conan 214 Oct 29 16:07 tmp.R

example2.R,可以接受页面传参数。

根据FastRWeb的说明,FastRWeb可以通过CGI,与任何的WebServer通信,这样我们就可以把R脚本部署在PHP, Python, Ruby, Java等高级语言的服务器上面了。

R-bloggers上有一篇文章,讲FastRWeb部署在基于Apache的XAMPP环境中:
http://www.r-bloggers.com/setting-up-fastrweb-on-mac-os-x/

感兴趣的同学,自行尝试吧!!

转载请注明出处:
http://blog.fens.me/r-fastrweb-rserve/

打赏作者

Nodejs与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-nodejs/

rserve-nodejs

前言

做web开发还没有用过Nodejs的同学,你们已经落后了。Nodejs是基于Javascript实现的一款后台程序开发平台,以我个人的体验开发效率比PHP还要高一些,完全异步加载性能一点也不落后,假以时日还有赶超趋势。

HTML5做为web前端大量使用Javascript,各种炫效果层出不穷。如果能把R语言的效果图,都用HTML5重新做渲染,并增加时时通信和用户交互,两种语言各取优势,必然产生惊为天人的效果。

长话短说,今天介绍 Nodejs与R跨平台通信

目录

  1. Nodejs简单介绍
  2. R语言配置环境
  3. Nodejs配置环境
  4. Nodejs与R跨平台通信

1. Nodejs简单介绍

Node.js是一个可以快速构建网络服务及应用的平台,基于Chrome’s JavaScript runtime,也就是说,实际上它是对GoogleV8引擎(应用于Google Chrome浏览器)进行了封装。V8引擎执行Javascript的速度非常快,性能非常好。Node对一些特殊用例进行了优化,提供了替代的API,使得V8在非浏览器环境下运行得更好。

2. R语言配置环境

本文中介绍的 Nodejs与R的跨平台通信,对于R语言的支持库是Rserve,通过Rserve提供一个R的TCP/IP的通信协议,实现Nodejs和R的通信。关于如何配置Rserve,请参考文章:Rserve与Java的跨平台通信

我已经在Linux配置好的Rserve环境,进程号9736,端口6311


~ ps -aux|grep Rserve
conan     9736  0.0  1.2 116288 25440 ?        Ss   13:11   0:01 /usr/lib/R/bin/Rserve --RS-enable-remote

~ netstat -nltp|grep Rserve
tcp        0      0 0.0.0.0:6311            0.0.0.0:*               LISTEN      9736/Rserve

3. Nodejs配置环境

对于Nodejs环境,也比较简单,以express3库作为基础web框架,rio是让Nodejs与Rserve通信的依赖库。如果是Nodejs的新手从头学习,请参考系列文章:从零开始nodejs系列文章,如果仅仅搭建一个Nodejs测试环境,请参考文章:准备Nodejs开发环境Ubuntu

现在我们已创建好了Express3的项目(开发环境Win7)

项目目录:D:\workspace\project\investment\webui


~ D:\workspace\project\investment\webui>ls
README.md  app.js  models  node-rio-dump.bin  node_modules  package.json  public  routes  views

安装rio库


~ D:\workspace\project\investment\webui>npm install rio
npm http GET https://registry.npmjs.org/rio
npm http 200 https://registry.npmjs.org/rio
npm http GET https://registry.npmjs.org/rio/-/rio-0.9.0.tgz
npm http 200 https://registry.npmjs.org/rio/-/rio-0.9.0.tgz
npm http GET https://registry.npmjs.org/hexy
npm http GET https://registry.npmjs.org/binary
npm http 200 https://registry.npmjs.org/binary
npm http 200 https://registry.npmjs.org/hexy
npm http GET https://registry.npmjs.org/binary/-/binary-0.3.0.tgz
npm http GET https://registry.npmjs.org/hexy/-/hexy-0.2.5.tgz
npm http 200 https://registry.npmjs.org/hexy/-/hexy-0.2.5.tgz
npm http 200 https://registry.npmjs.org/binary/-/binary-0.3.0.tgz
npm http GET https://registry.npmjs.org/chainsaw
npm http GET https://registry.npmjs.org/buffers
npm http 200 https://registry.npmjs.org/buffers
npm http 200 https://registry.npmjs.org/chainsaw
npm http GET https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz
npm http GET https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz
npm http 200 https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz
npm http 200 https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz
npm http GET https://registry.npmjs.org/traverse
npm http 200 https://registry.npmjs.org/traverse
npm http GET https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz
npm http 200 https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz
rio@0.9.0 node_modules\rio
├── hexy@0.2.5
└── binary@0.3.0 (buffers@0.1.1, chainsaw@0.1.0)

4. Nodejs与R跨平台通信

下面我们开始写程序,来实现跨平台的通信。

在app.js配置文件中,增加一个路由路径


~ vi app.js
//代码有省略
var vis = require('./routes/vis')
app.get('/vis/rio',vis.rio);

在路由目录/routes增加一个路由文件vis.js


~ vi /routes/vis.js

var rio = require("rio");
exports.rio = function(req, res){
	options = {
		host : "192.168.1.201",
		port : 6311,
        callback: function (err, val) {
            if (!err) {
            	console.log("RETURN:"+val);
            	return res.send({'success':true,'res':val});
            } else {
            	console.log("ERROR:Rserve call failed")
            	return res.send({'success':false});
            }
        },
    }
    rio.enableDebug(true);//开启调试模式
    rio.evaluate("pi / 2 * 2 * 2",options);//运行R代码
};

在上面代码中,我们实现了rio与rserve的远程连接。以R的命令(pi / 2 * 2 * 2)作为参数,传给Rserve。通过callback的方法,获得R的返回值。

在浏览器中测试:
http://localhost:3000/vis/rio
在浏览器中返回:是一个json格式的对象

{
  "success": true,
  "res": 6.283185307179586
}

命令行日志


Connected to Rserve
Supported capabilities --------------

Sending command to Rserve
00000000: 0300 0000 1400 0000 0000 0000 0000 0000  ................
00000010: 0410 0000 7069 202f 2032 202a 2032 202a  ....pi./.2.*.2.*
00000020: 2032 0001                                .2..

Data packet
00000000: 2108 0000 182d 4454 fb21 1940            !....-DT{!.@

Type SEXP 33
Response value: 6.283185307179586
RETURN:6.283185307179586
GET /vis/rio 200 33ms - 49b
Disconnected from Rserve
Closed from Rserve

我可以看到nodejs与Rserve的通信情况,Response value: 6.283185307179586,与页面上面是一致的。

接下来,我们改一下R的运行命令:
rnorm(10),取10个符合N(0,1)正态分布的随机数


rio.evaluate("rnorm(10)",options);//运行R代码

浏览器返回结果


{
  "success": true,
  "res": [
    -0.011531884725262991,
    0.5106443501593562,
    -0.05216533321965309,
    1.9221980152236238,
    0.5205238122633465,
    -0.3275367539102907,
    -0.06588102930129405,
    1.5410418730008988,
    1.308169913050071,
    0.005044179478212583
  ]
}

命令行日志


Connected to Rserve
Supported capabilities --------------

Sending command to Rserve
00000000: 0300 0000 1000 0000 0000 0000 0000 0000  ................
00000010: 040c 0000 726e 6f72 6d28 3130 2900 0101  ....rnorm(10)...

Data packet
00000000: 2150 0000 f6ca 0c5e 079e 87bf 9b4a fad1  !P..vJ.^...?.JzQ
00000010: 3257 e03f eda2 5320 6ab5 aabf 2b25 bdb4  2W`?m"S.j5*?+%=4
00000020: 52c1 fe3f ebba ce8d 21a8 e03f bc17 92b7  RA~?k:N.!(`?<..7
00000030: 5cf6 d4bf ca9f 4642 94dd b0bf 1be3 e485  \vT?J.FB.]0?.cd.
00000040: 1ba8 f83f 5a94 2293 43ee f43f 1724 4e9e  .(x?Z.".Cnt?.$N.
00000050: 34a9 743f                                4)t?

Type SEXP 33
Response value: -0.011531884725262991,0.5106443501593562,-0.05216533321965309,1.9221980152236238,0.5205238122633465,-0.3
275367539102907,-0.06588102930129405,1.5410418730008988,1.308169913050071,0.005044179478212583
RETURN:-0.011531884725262991,0.5106443501593562,-0.05216533321965309,1.9221980152236238,0.5205238122633465,-0.3275367539
102907,-0.06588102930129405,1.5410418730008988,1.308169913050071,0.005044179478212583
GET /vis/rio 200 30ms - 285b
Disconnected from Rserve
Closed from Rserve

我们实现了Nodejs与R跨平台通信,有点感觉像打通了中国功夫的“任督二脉”,从此以后,成为一代高手。

转载请注明出处:
http://blog.fens.me/r-rserve-nodejs/

打赏作者