我一直在使用管道工程序包开发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,因此这可能是问题的一部分。提前谢谢。
答案 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,则可能需要将路径更改为适合系统的路径。