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/

打赏作者

This entry was posted in R语言实践

  • Leo Sui

    wonderful work!

  • jack

    您好有一个问题想问问,环境都搭好了运行http://web:8888/index报Script /cgi-bin/R/main.R not found

    • 如果搭建好了,应该不会出现错误了。重新对照文章,一步一步做!

      • lr

        我到了那两个端口哪里,但是不知道为什么图无法显示。倒是连接上了

  • zk

    Hello,我按照博主的步骤配置,但是在启动FastRWeb的时候,会报错:SOCK_ERROR: bind error #98(address already in use)

    • 这个错误,应该是端口冲突了。
      你换一个端口吧,port: 10001

  • Echo Ou

    想请教博主,想在这个上面运行自己写的R脚本,自己写的脚本里有library包,可是页面显示没法library包,求帮助,跪谢!!

    • Echo Ou

      解决了~~捉摸了一下,发现在rserve.R里添加就可以了~~~~

      • 是的, 🙂

        • Echo Ou

          崇拜博主 T_T

        • Kongnuan Zhao

          那是不是要再start?

  • yishuiruyan

    你好,刷新网页时偶尔会出现如下错误:Error in Cairo(width, height, type = type, file = file, …) : unused arguments (width, height, type = type, file = file),请问你知道是什么原因吗?(画的一个比较简单的饼图),求指导。

    • 是不是Cairo库出现什么问题?

      参考这篇文章,先在你的环境中安装并运行Cairo
      http://blog.fens.me/r-cairo/

      • yishuiruyan

        Cairo安装了可以运行,但是根本没有用到Cairo,会什么会报和Cairo有关的错呢?

        • 你虽然没有直接使用Cairo,但FastRWeb包是依赖Cairo的,所有的图形都是调用Cairo画出来的。

          • yishuiruyan

            Cairo是可以正常运行的,还是会出现这个问题,

          • 只有这个错误提示,我看不出来是什么原因。

  • Janny

    启动时,出现xml包没有正常加载,但是http://192.168.80.236:8888/example1.png例子是可以打开的,请问是什么原因啊?

    • 重新加载一下XML包吧,example1没有用到XML相关的代码。

  • xjd

    为什么我执行sudo ./start这步他提示我:/usr/lib/R/bin/Rcmd: 62: exec: Rserve: not found,谢谢

    • Rserve没有装好吧,你读一下Rserve的安装的文章

      • xjd

        解决了,我是将start文件中Rserve改成Rserve的完整路径就可以了,不知道为什么

    • Kongnuan Zhao

      遇到一样的问题,怎么改呢,能详细一些吗

    • weiqi.tan

      你好,能加个qq吗,745878133,我运行sudo ./start时也出现…Resources/bin/Rcmd: line 62: exec: Rserve: not found,但是start文件中没有Rserve啊

  • Kongnuan Zhao

    超赞,这就来试一下

  • homalu

    FastRWeb里面使用ggplot,图形无法显示。。。请问如何解决?

    • 你检查一下后台,估计是图片生成的位置不对。

  • Jerome Cao

    丹哥你真厉害,我今天刚想到能否在web上跑R,你两年前就写出来了,佩服!

  • fengshi

    博主,我修改好配置文件,然后运行:sudo ./start ,报错了:R CMD Rserve –RS-conf /var/FastRWeb/code/rserve.conf –vanilla –no-save
    ./start:行21: R: 未找到命令

    我查看了start的代码,发现最后两行是这样的:echo $RBIN CMD ${PRE}Rserve$PX –RS-conf $ROOT/code/rserve.conf –vanilla –no-save
    $RBIN CMD ${PRE}Rserve$PX –RS-conf $ROOT/code/rserve.conf –vanilla –no-save

    报错的事最后一行吧,你的start文件是这样的吗?