R工程化—Rest API 之plumber包

栏目: 编程工具 · 发布时间: 5年前

作者: 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?,返回如下结果:

R工程化—Rest API 之plumber包

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

#' Echo the parameter that was sent in

#' @serializer unboxedJSON

#' @param msg The message to echo back.

#' @get /predict

Merry Christmas

R工程化—Rest API 之plumber包

R工程化—Rest API 之plumber包

R工程化—Rest API 之plumber包

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

回复 爬虫 爬虫三大案例实战  

Python

1小时破冰入门

回复 数据挖掘  R语言入门及数据挖掘

回复  人工智能 三个月入门人工智能

回复  数据分析师 数据分析师成长之路 

回复 机器学习 机器学习的商业应用

回复  数据科学 数据科学实战

常用算法

常用数据挖掘算法

本文由R语言中文社区 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。

转载、引用前需联系作者,并署名作者且注明文章出处。

本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

O2O进化论

O2O进化论

板砖大余、姜亚东 / 中信出版社 / 2014-5 / 49

在互联网的1.0时代,Online的商业和Offline的商业就像是两条平行线,没有交汇点,在移动浪潮下,他们正在交汇,这就是O2O(Online to Offline)。于是,人们认为:O2O就是线下将线上作为销售前台。结论是对的,但并非简单相加就可以达到。人们已经进入数据革命时期,O2O是线上和线下全流通的数据化工具,电子商务就是非数据商品的数据化。其次,O2O还是一种竞争格局。这决定了以O2......一起来看看 《O2O进化论》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

URL 编码/解码
URL 编码/解码

URL 编码/解码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器