Nodejs和R交互
原文http://blog.youkuaiyun.com/tututototo/article/details/51405030
之前从网上找的例子较少,不是加载不了R源文件就是连接IP各种报错,自己对nodejs并不太熟悉,经过调试后终于通了。
1、服务器端Rserve配置
方法一 Rstudio下安装
在工作目录下创建Rserver.R文件
install.packages("Rserve")##安装
library(Rserve)##加载
Rserve()
方法二 命令行下安装
在window是命令行进入Rserve位置,一般在安装目录.\R-3.2.4\library\Rserve\libs\i386下,注意区别32位和64系统
在命令行输入R CMD RServe即可
2、客户端Nodejs配置
在工作目录下加载rio,在命令行输入 npm install rio
npm install rio
3、Nodejs与R的交互
1、R命令模式
在客户端工作目录下创建test1.js文件,代码如下:
var rio = require("rio");
rio.enableDebug(true);//开启调试模式
rio.evaluate({
command: "rnorm(20)",
host : "xxx.xxx.xxx.xxx"//服务器IP地址
});
关闭调试模式下
开启调试模式下
2、R文件模式
在服务器端工作目录下创建uniqueSort.R(我的路径为D:/Rserve)
if (!"RJSONIO" %in% names(installed.packages()[,"Package"])){
install.packages("RJSONIO")
}
library(RJSONIO)
uniqueSort <- function(test){
test <- fromJSON(test)
test <- unlist(test$test)
test <- unique(test)
test <- sort(test)
res <- list(test=test)
toJSON(res)
}
# args <- '{"test":[1,4,4,1,1,0,0,1,1,1,1,0,1,0,2,0,1,1,2,0,0,3,2]}'
# res <- uniqueSort(args)
# fromJSON(res)$test
在客户端工作目录下创建test2.js文件
var rio = require("rio");
var r_path = "D:/Rserve";//服务器端R文件路径
var r_file_command = "source(\'" + r_path + "/uniqueSort.R" +"\')";//R路径及名称
var args = {test: [1,4,4,1,1,0,0,1,1,1,1,0,1,0,2,0,1,1,2,0,0,3,2]};
function displayResponse(err, res) {
if (!err) {
res = JSON.parse(res);
console.log("result is " + res.test);
//结果为0,1,2,3,4
} else {
console.log("Optimization failed");
}
}
//rio.enableDebug(true);//开启调试模式
rio.evaluate({
command: r_file_command,//加载R源
entrypoint: "uniqueSort",//R中的函数
data: args,//Nodejs传入R的参数
callback: displayResponse,
host : "xxx.xxx.xxx.xxx"//服务器IP
});
运行结果
[1].Nodejs与R跨平台通信 http://blog.fens.me/r-rserve-nodejs/
[2].node-rio https://github.com/albertosantini/node-rio