R工程化—Rest API 之plumber包

640?wx_fmt=png

作者: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()


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

640?wx_fmt=png


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

640?wx_fmt=png


模型调用的例子

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

#逻辑回归模型调用的例子
#例子需要处理成二分类
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?,返回如下结果:

640?wx_fmt=png


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

#' Echo the parameter that was sent in
#' @serializer unboxedJSON
#' @param msg The message to echo back.
#' @get /predict
640?wx_fmt=gifMerry Christmas 640?wx_fmt=gif

640?wx_fmt=png

640?wx_fmt=jpeg


640?wx_fmt=jpeg

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值