R工程化—Rest API 之plumber包

浏览: 1578

作者: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语言入门及数据挖掘
回复 人工智能      三个月入门人工智能
回复 数据分析师   数据分析师成长之路 
回复 机器学习      机器学习的商业应用
回复 数据科学      数据科学实战
回复 常用算法      常用数据挖掘算法

推荐 0
本文由 R语言中文社区 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册