很多R使用者都会遇到这样的情境,自己建好了一个模型,预测时需要实时计算,因此需要上线与后端JAVA对接,有以下解决办法:
- JAVA调R语言。
- 以数据库或本地文件为媒介,将对应的R写成传参脚本实时计算好入库或者生成本地文件,再读取结果。
- 封装成传参的Rest API接口。
对于1有两个问题,稳定性与中文编码。2的话,在数据量小的时候可行,数据量大且不需入库时存储压力大,且要考虑数据前后的对应问题。
本文主要针对3做简单介绍,R中Rest API的包主要有plumber,opencpu。由于plumber使用起来极其方便,把它当做第一选择。
安装
install.packages
官网案例
首先新建一个名为plumber.R的脚本,
# plumber.R
该函数很简单,返回含msg文本输出的list。
为什么要返回list结构?因为plumber会自动把list转化为json结构输出,因此可以很方便地通过list构建你想要的输出结构,plumber会自动转换成对应结构的json。
然后运行
pr
即可在命令行看到以下输出
此时,在浏览器输入http://127.0.0.1:4267/echo?msg=Rstudio,(get请求可以直接浏览器调用,ip:port之后输入你想要调用的函数名字echo,?后接para1=xxx¶2=xxx·······)会立即返回如下的json结果(注意端口号要一致):
模型调用的例子
首先建立一个简单逻辑回归的模型
#逻辑回归模型调用的例子
plumber.R如下
# plumber.R
脚本调用或在命令行输入
load
host为0.0.0.0表示其他机器可以通过该机器在局域网的ip地址调用,port指定一个端口。
接口启动后在浏览器输入http://127.0.0.1:4267/predict?v1=6&v2=2&v3=6&v4=1,返回如下结果:
如果需要返回没有中括号包裹的json,在plumber.R对应的函数上方加第二行参数
#' Echo the parameter that was sent in
#' @serializer unboxedJSON
#' @param msg The message to echo back.
#' @get /predict
悄悄告诉你,我们的微信公众号也叫《R语言工程化》,欢迎关注!