3

我一直在使用管道工包开发 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)

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

请注意,关于使用管道工托管 API,我还有很多东西要学习,所以这可能是问题的一部分。提前致谢。

4

1 回答 1

1

你快到了!但是您缺少一个序列化程序来告诉管道工将您的绘图输出为例如 png。看看下面的第二行,我在其中添加@png. 那是序列化器,是文档中描述的众多序列化器之一。

#* @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)
}

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

一种方法如下:

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

这会将您的绘图保存为桌面上的 PNG(如果您在 Windows 或 Mac 上,您可能需要将路径更改为适合您系统的路径。

于 2018-10-25T03:04:55.597 回答