Nodejs与R跨平台通信
当前位置:以往代写 > 其他教程 >Nodejs与R跨平台通信
2019-06-14

Nodejs与R跨平台通信

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: [email protected]
  • 转载请注明出处:
    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
    [email protected] node_modules\rio
    ├── [email protected]
    └── [email protected] ([email protected], [email protected])
    

    4. Nodejs与R跨平台通信

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

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

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

    #p#分页标题#e#

    在路由目次/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{[email protected]
    
    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/

      关键字:

    在线提交作业