R:在将数据发布到使用管道工创建的REST API时在网页上打印图表

时间:2017-09-19 14:25:34

标签: r rest api plumber

我一直在使用管道工程序包开发REST API。我还在学习如何做到这一点的基础知识。我希望API能够:

1)收到POSTed数据和参数并运行模型。 2)发回结果。 3)在网页(或任何网页)上打印图表。

我有#1和#2工作,但我找不到办法#3。我确信有些概念我还没有完全理解。

这是运行API的脚本。我一直在RStudio的一个例子中运行它:

# Packages
library(plumber)
library(jsonlite)

#* @post /predict_mtcars
mtcars.driver <- function(df, depVar, predVars){

  # Convert objects to JSON
  depVar <- fromJSON(depVar)
  predVars <- fromJSON(predVars)
  df <- fromJSON(df)

  df <- df[, c(depVar, predVars)]
  fit <- lm(df)
  outDf <- data.frame(depVar = df[depVar], 'Predicted' = predict(fit),
                      'Residuals' = fit$residuals)
  print(plot(outDf))
  return(toJSON(outDf))

}

这是我驱动该脚本的代码:

# Deploy.R
library(plumber)
setwd('YOUR PATH')
r <- plumb("Driver.R")
r$run(port=8080)

这是我在第二个RStudio实例上运行的测试脚本:

# Packages
library(sp)
library(jsonlite)
library(httr)

# Data
data(mtcars)

# Parameters
depVar <- 'mpg'
predVars <- c('cyl', 'hp', 'wt')
df <- mtcars

body <- list("df" = toJSON(df),
             "depVar" = toJSON(depVar),
             "predVars" = toJSON(predVars))
req <- POST('http://localhost:8080/predict_mtcars', 
            body = body,
            encode = 'json',
            verbose())

outDf <- fromJSON(content(req)[[1]][1])
plot(outDf)

除第一个脚本中的print / plot语句外,所有这些都有效。我在网上看到的内容很少见,但能够将数据发布到API然后在API的网站上打印图表和其他信息似乎很有用。

请注意,我仍然需要学习使用管道工托管API,因此这可能是问题的一部分。提前谢谢。

1 个答案:

答案 0 :(得分:0)

您快到了!但是您缺少序列化程序来告诉水管工将您的绘图输出为png。请看下面的第二行,在其中添加@png。那是序列化程序,并且是许多described in the documentation之一。

#* @post /predict_mtcars
#* @png
mtcars.driver <- function(df, depVar, predVars){

  # Convert objects to JSON
  depVar <- fromJSON(depVar)
  predVars <- fromJSON(predVars)
  df <- fromJSON(df)

  df <- df[, c(depVar, predVars)]
  fit <- lm(df)
  outDf <- data.frame(depVar = df[depVar], 'Predicted' = predict(fit),
                      'Residuals' = fit$residuals)
  plot(outDf)
}

当您使用失眠之类的API客户端调用png中的图时,它将在此处渲染。但是使用测试脚本,您将需要从req对象中获取二进制内容。

执行此操作的一种方法如下:

writeBin(req$content, con = file("~/Desktop/outDf.png", "wb"))

这会将您的地块另存为PNG桌面(如果您使用的是Windows或Mac,则可能需要将路径更改为适合系统的路径。