博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Nodejs与R跨平台通信
阅读量:2719 次
发布时间:2019-05-13

本文共 5489 字,大约阅读时间需要 18 分钟。

,涵盖了R的思想,使用,工具,创新等的一系列要点,以我个人的学习和体验去诠释R的强大。

R语言作为统计学一门语言,一直在小众领域闪耀着光芒。直到大数据的爆发,R语言变成了一门炙手可热的数据分析的利器。随着越来越多的工程背景的人的加入,R语言的社区在迅速扩大成长。现在已不仅仅是统计领域,教育,银行,电商,互联网….都在使用R语言。

要成为有理想的极客,我们不能停留在语法上,要掌握牢固的数学,概率,统计知识,同时还要有创新精神,把R语言发挥到各个领域。让我们一起动起来吧,开始R的极客理想。

关于作者:

  • 张丹(Conan), 程序员Java,R,PHP,Javascript
  • weibo:@Conan_Z
  • blog: 
  • email: bsspirit@gmail.com

转载请注明出处:

前言

做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,请参考文章:

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

~ ps -aux|grep Rserveconan     9736  0.0  1.2 116288 25440 ?        Ss   13:11   0:01 /usr/lib/R/bin/Rserve --RS-enable-remote~ netstat -nltp|grep Rservetcp        0      0 0.0.0.0:6311            0.0.0.0:*               LISTEN      9736/Rserve

3. Nodejs配置环境

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

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

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

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

安装rio库

~ D:\workspace\project\investment\webui>npm install rionpm http GET https://registry.npmjs.org/rionpm http 200 https://registry.npmjs.org/rionpm http GET https://registry.npmjs.org/rio/-/rio-0.9.0.tgznpm http 200 https://registry.npmjs.org/rio/-/rio-0.9.0.tgznpm http GET https://registry.npmjs.org/hexynpm http GET https://registry.npmjs.org/binarynpm http 200 https://registry.npmjs.org/binarynpm http 200 https://registry.npmjs.org/hexynpm http GET https://registry.npmjs.org/binary/-/binary-0.3.0.tgznpm http GET https://registry.npmjs.org/hexy/-/hexy-0.2.5.tgznpm http 200 https://registry.npmjs.org/hexy/-/hexy-0.2.5.tgznpm http 200 https://registry.npmjs.org/binary/-/binary-0.3.0.tgznpm http GET https://registry.npmjs.org/chainsawnpm http GET https://registry.npmjs.org/buffersnpm http 200 https://registry.npmjs.org/buffersnpm http 200 https://registry.npmjs.org/chainsawnpm http GET https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgznpm http GET https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgznpm http 200 https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgznpm http 200 https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgznpm http GET https://registry.npmjs.org/traversenpm http 200 https://registry.npmjs.org/traversenpm http GET https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgznpm http 200 https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgzrio@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.jsvar 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 RserveSupported capabilities --------------Sending command to Rserve00000000: 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 packet00000000: 2108 0000 182d 4454 fb21 1940            !....-DT{!.@Type SEXP 33Response value: 6.283185307179586RETURN:6.283185307179586GET /vis/rio 200 33ms - 49bDisconnected from RserveClosed 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 RserveSupported capabilities --------------Sending command to Rserve00000000: 0300 0000 1000 0000 0000 0000 0000 0000  ................00000010: 040c 0000 726e 6f72 6d28 3130 2900 0101  ....rnorm(10)...Data packet00000000: 2150 0000 f6ca 0c5e 079e 87bf 9b4a fad1  !P..vJ.^...?.JzQ00000010: 3257 e03f eda2 5320 6ab5 aabf 2b25 bdb4  2W`?m"S.j5*?+%=400000020: 52c1 fe3f ebba ce8d 21a8 e03f bc17 92b7  RA~?k:N.!(`?<..7 d4bf ca9f b0bf e485 f83f f43f . type sexp response value: return:-0.011531884725262991 get disconnected from rserve closed>

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

转载请注明出处:

打赏作者

This entry was posted in ,

你可能感兴趣的文章
java开发常用linux命令,干货满满
查看>>
java开发成长路线,Java架构师成长路线
查看>>
爱了爱了!java是不是比前端难
查看>>
如何设计一个优雅的RESTFUL的接口?一篇文章帮你解答
查看>>
借花献佛!手持4个大厂offer的我,一文轻松搞定
查看>>
全靠这套面试题,java常用算法手册pdf,深夜思考
查看>>
java移位运算有什么作用,王者笔记!
查看>>
敏捷开发之Scrum扫盲篇
查看>>
遇到Nand Flash坏块怎么处理?
查看>>
mount ,mkfs 工具详细说明(ext4,xfs)
查看>>
oracle 把一张表中的某字段的多条记录用逗号连接
查看>>
oracle按每天,每周,每月,每季度,每年查询统计数据
查看>>
TCP/IP概述
查看>>
ARP和RARP
查看>>
IP协议家族
查看>>
Linux设备驱动编程之阻塞与非阻塞
查看>>
Linux常用命令(一)
查看>>
Linux常用命令(二)
查看>>
Linux用户和文件权限管理
查看>>
Ionic3学习笔记(一)安装、项目结构与常用命令
查看>>