R工程化—Rest API 之plumber包

2018 年 12 月 25 日 R语言中文社区

作者:stone  R语言中文社区专栏作

知乎ID:

https://zhuanlan.zhihu.com/p/50987545


很多R使用者都会遇到这样的情境,自己建好了一个模型,预测时需要实时计算,因此需要上线与后端JAVA对接,有以下解决办法:

  1. JAVA调R语言。

  2. 以数据库或本地文件为媒介,将对应的R写成传参脚本实时计算好入库或者生成本地文件,再读取结果。

  3. 封装成传参的Rest API接口。

对于1有两个问题,稳定性与中文编码。2的话,在数据量小的时候可行,数据量大且不需入库时存储压力大,且要考虑数据前后的对应问题。

本文主要针对3做简单介绍,R中Rest API的包主要有plumber,opencpu。由于plumber使用起来极其方便,把它当做第一选择。


安装
install.packages("plumber", repos = "https://mirrors.tongji.edu.cn/CRAN/")


官网案例

首先新建一个名为plumber.R的脚本,

# plumber.R

#' Echo the parameter that was sent in
#' @param msg The message to echo back.
#' @get /echo
function(msg=""){
  list(msg = paste0("The message is: '", msg, "'"))
}


该函数很简单,返回含msg文本输出的list。

为什么要返回list结构?因为plumber会自动把list转化为json结构输出,因此可以很方便地通过list构建你想要的输出结构,plumber会自动转换成对应结构的json。

然后运行:

pr <- plumber::plumb("plumber.R")
pr$run()


即可在命令行看到以下输出:


此时,在浏览器输入127.0.0.1:4267/echo?,(get请求可以直接浏览器调用,ip:port之后输入你想要调用的函数名字echo,?后接para1=xxx&para2=xxx·······)会立即返回如下的json结果(注意端口号要一致):


模型调用的例子

首先建立一个简单逻辑回归的模型:

#逻辑回归模型调用的例子
#例子需要处理成二分类
all.data <- iris[iris$Species != 'setosa', ]

#分训练测试
set.seed(1234)
ind <- sample(2, nrow(all.data), replace = TRUE, prob = c(0.7, 0.3)) 
traindata <- all.data[ind == 1, ]
testdata <- all.data[ind == 2, ]
#训练模型
fit <- glm(Species ~ ., family = binomial(link = 'logit'), data = traindata)
#保存模型
save(fit, file = "fit.RData")


plumber.R如下:

# plumber.R

#' Echo the parameter that was sent in
#' @param msg The message to echo back.
#' @get /predict
function(v1, v2, v3, v4){
  predict(fit, type = 'response', newdata = data.frame(Sepal.Length = as.numeric(v1), 
                                                       Sepal.Width = as.numeric(v2), 
                                                       Petal.Length = as.numeric(v3), 
                                                       Petal.Width = as.numeric(v4)))
}


脚本调用或在命令行输入:

load("fit.RData")
pr <- plumber::plumb("plumber.R")
pr$run(host = "0.0.0.0", port = 4267)


host为0.0.0.0表示其他机器可以通过该机器在局域网的ip地址调用,port指定一个端口。

接口启动后在浏览器输入127.0.0.1:4267/predict?,返回如下结果:


如果需要返回没有中括号包裹的json,在plumber.R对应的函数上方加第二行参数:

#' Echo the parameter that was sent in
#' @serializer unboxedJSON
#' @param msg The message to echo back.
#' @get /predict
Merry Christmas




公众号后台回复关键字即可学习

回复 爬虫             爬虫三大案例实战  
回复 
Python        1小时破冰入门

回复 数据挖掘      R语言入门及数据挖掘
回复 
人工智能      三个月入门人工智能
回复 数据分析师   数据分析师成长之路 
回复 机器学习      机器学习的商业应用
回复 数据科学      数据科学实战
回复 常用算法      常用数据挖掘算法

登录查看更多
11

相关内容

面向服务的前后端通信标准 Not React
【2020新书】实战R语言4,323页pdf
专知会员服务
100+阅读 · 2020年7月1日
【实用书】流数据处理,Streaming Data,219页pdf
专知会员服务
76+阅读 · 2020年4月24日
【2020新书】Kafka实战:Kafka in Action,209页pdf
专知会员服务
67+阅读 · 2020年3月9日
TensorFlow Lite指南实战《TensorFlow Lite A primer》,附48页PPT
专知会员服务
69+阅读 · 2020年1月17日
【干货】谷歌Joshua Gordon 《TensorFlow 2.0讲解》,63页PPT
专知会员服务
27+阅读 · 2019年11月2日
知识图谱本体结构构建论文合集
专知会员服务
106+阅读 · 2019年10月9日
社区分享 | Spark 玩转 TensorFlow 2.0
TensorFlow
15+阅读 · 2020年3月18日
通过Docker安装谷歌足球游戏环境
CreateAMind
11+阅读 · 2019年7月7日
用Now轻松部署无服务器Node应用程序
前端之巅
16+阅读 · 2019年6月19日
如何用TF Serving部署TensorFlow模型
AI研习社
26+阅读 · 2019年3月27日
TF Boys必看!一文搞懂TensorFlow 2.0新架构!
引力空间站
18+阅读 · 2019年1月16日
用Python调用百度OCR接口实例
数据挖掘入门与实战
16+阅读 · 2018年1月29日
Arxiv
5+阅读 · 2018年6月12日
Arxiv
7+阅读 · 2018年3月21日
Arxiv
4+阅读 · 2018年2月13日
Arxiv
3+阅读 · 2017年12月18日
Arxiv
5+阅读 · 2015年9月14日
VIP会员
相关VIP内容
相关资讯
社区分享 | Spark 玩转 TensorFlow 2.0
TensorFlow
15+阅读 · 2020年3月18日
通过Docker安装谷歌足球游戏环境
CreateAMind
11+阅读 · 2019年7月7日
用Now轻松部署无服务器Node应用程序
前端之巅
16+阅读 · 2019年6月19日
如何用TF Serving部署TensorFlow模型
AI研习社
26+阅读 · 2019年3月27日
TF Boys必看!一文搞懂TensorFlow 2.0新架构!
引力空间站
18+阅读 · 2019年1月16日
用Python调用百度OCR接口实例
数据挖掘入门与实战
16+阅读 · 2018年1月29日
Top
微信扫码咨询专知VIP会员