我正在考虑使用编程语言R构建RESTful API ,主要是以API格式向用户公开我的机器学习模型.我知道有一些选项可以导出到PMML,PFA并使用其他语言来处理API部分.但是,我想坚持使用相同的编程语言,并想知道R中是否有类似Flask/Django/Springbook框架的东西?
我试图使用R中的Plumber通过Web API公开模型.我希望API调用在https上是安全的.我试图找到使用管道工实现安全API的信息,但遗憾的是没有找到任何东西.有没有人有洞经验?或者通过安全API公开R模型的任何其他解决方案?
我正在使用 ggplot 绘制条形图,并使用 R 中的管道工包将此函数创建为 Web api。
 library(plumber)
 library(ggplot2)
#' @get /histogram_test
#' @png
  histogram_test <- function(){
  mtcars=mtcars
  b=ggplot(mtcars,aes(mtcars$cyl))
  b+geom_bar()
}
Run Code Online (Sandbox Code Playgroud)
然后我运行:
r <- plumb("plum_api.R")
r$run(port=8000)
Run Code Online (Sandbox Code Playgroud)
但这不会在浏览器上返回绘图。
在我的 Rscript (run.R) 中:
library(plumber)
r <- plumb("script.R")
r$run(host="127.0.0.1",port=8000)
Run Code Online (Sandbox Code Playgroud)
如果我使用 RStudio 或 R 控制台运行上面的代码,它工作正常,并在以下输出后让我访问:
启动服务器侦听端口 8000 在http://127.0.0.1:8000/ swagger /运行 swagger UI
但是当我尝试使用 Rscript, R CMD BATCH,R < run.R, pm2 运行与 .R 文件相同的代码时,它会卡住;
启动服务器监听 8000 端口
在访问地址时,我收到 404: Resource Not Found 错误。另外,请注意,我想在 Windows 上运行它,因此没有尝试更小。任何想法,我在这里做错了什么。谢谢!
我看到很多人问这个问题的各种版本,但我还没有找到明确的答案。
我想向 R Shiny 应用程序发送 POST 请求,以便在收到请求后,Shiny 应用程序可以呈现请求正文中的数据。例如,考虑这样一个用例:我编写了某种特殊的analyzeData(data)R 函数,某人可以在笔记本电脑上本地运行该函数。在该函数中,将有一个httr::POST将数据上传到 Shiny 服务器的请求,然后用户将弹出浏览器并看到显示在服务器上分析的数据的 UI。从某种意义上说,它有点像“上传数据”按钮的奇特版本,但它们不是从 Shiny UI 中上传数据,而是在通过函数请求打开 UI 之前完成上传。
所以流程是:
analyzeData(data)函数据我所知,Shiny无法以这种方式接受 POST 请求。事实上,我不确定除了通过 UI 之外还有什么方法可以让 Shiny 接受数据。这几乎就像我想让 Plumber 和 Shiny 在同一台机器上运行(Plumber 接受数据 POST 请求,Shiny 然后渲染生成的 UI),但这感觉像是过度设计。
我错过了什么吗?有没有办法让这个流程与 Shiny 直接接受 POST 请求一起工作?
我想为一个静态文件plumber的描述在这里。带有路线等的文件是server.R:
#* @get /files
function()
{
  return(dir("files"))
}
#* @static ./files
list() 
Run Code Online (Sandbox Code Playgroud)
这应该使files目录在路径上可用/public。里面files有一个文件index.html。运行上面的代码:
library(plumber)
r <- plumb("server.R")
r$run()
Run Code Online (Sandbox Code Playgroud)
调用localhost:8000/files返回:
["index.html"]
Run Code Online (Sandbox Code Playgroud)
但是,调用localhost:8000/public/index.html会出现 404 错误:
{"error":["404 - Resource Not Found"]}
Run Code Online (Sandbox Code Playgroud)
打印r对象,公共路径似乎已定义:
> r
<plumber>
  Public:
    addAssets: function (dir, path = "/public", options = list()) 
    ...
Run Code Online (Sandbox Code Playgroud)
我哪里出错了?
我正在尝试显示通过管道工 API 请求的交互式图形并将其显示在闪亮的应用程序中。我不知道如何使它工作,例如使用 highcharter。下面是我使用 api 的带有基本图和 highcharter 图的示例应用程序。
我有 api 工作,但有谁知道如何解析 htmlwidget 输入以显示?
谢谢您的帮助!
示例api,开始使用
library(plumber)
r <- plumb("api.R") 
r$run(port=8000)
Run Code Online (Sandbox Code Playgroud)
api.R
#' Plot out data from the iris dataset
#' @param spec If provided, filter the data to only this species (e.g. 'setosa')
#' @get /plot
#' @png
function(spec){
  myData <- iris
  title <- "All Species"
  # Filter if the species was specified
  if (!missing(spec)){
    title <- paste0("Only the '", spec, "' Species")
    myData <- subset(iris, Species == spec)
  } …Run Code Online (Sandbox Code Playgroud) 因此,如果我手动运行管道工命令,我有一个可以在本地和服务器上正常工作的 API,我的意思是在服务器中 ssh-ing 并运行:
r <- plumb("plumber.R")
r$run(port=8000, host = "0.0.0.0")
Run Code Online (Sandbox Code Playgroud)
它看起来像这样:
#* @serializer contentType list(type="application/html")
#* @get /test
function(res){
  include_rmd("test.Rmd", res)
}
#* 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, "'"))
}
Run Code Online (Sandbox Code Playgroud)
他们都没有问题。但是当我使用 systemd 使它们在服务器上保持活动状态时,只有 /echo 有效。另一个只是说“发生异常”。
systemd 设置如下所示:
[Unit]
Description=Plumber API
# After=postgresql
# (or mariadb, mysql, etc if you use a DB with Plumber, otherwise leave this commented) …Run Code Online (Sandbox Code Playgroud) 背景
我有一个远程服务器,通过 Plumber 在该服务器上运行 R API 服务。从我可以从外部调用我的服务的意义上来说,它是完全可操作的。
我正在使用 Ubuntu/Nginx 反向代理设置。Plumber 服务正在侦听端口 1163。我随后实现了以下 Nginx 重新路由,以便 API 侦听https://server.net/API/:
location /API/ {
 proxy_pass http://localhost:1163/;
 proxy_redirect http://localhost:1163/ $scheme://$host/;
}
Run Code Online (Sandbox Code Playgroud)
这工作正常。现在,默认情况下,Swagger UI 会监听
http://127.0.0.1:1163/__swagger__/
Run Code Online (Sandbox Code Playgroud)
由于上面的配置,这意味着我可以成功访问 Swagger UI
https://server.net/API/__swagger__/
Run Code Online (Sandbox Code Playgroud)
问题
我想配置 Nginx 以便 Swagger UI 监听https://server.net/API/documentation/。我尝试了以下嵌套 Nginx 配置:
location /API/ {
 proxy_pass http://localhost:1163/;
 proxy_redirect http://localhost:1163/ $scheme://$host/;
 location /API/documentation/ {
 proxy_pass http://localhost:1163/__swagger__/;
 proxy_redirect http://localhost:1163/__swagger__/ $scheme://$host/;
 }
}
Run Code Online (Sandbox Code Playgroud)
现在,在浏览器中输入所需的 URL https://server.net/API/documentation/时,我检索 Swagger 界面,但它返回以下错误代码:
显然,Nginx 重定向期间解析了错误的 swagger URL。考虑到 url 应该说明这一点,这一点很清楚
https://server.net/API/swagger.json?schemes=https&host=server.net&path=/API/
Run Code Online (Sandbox Code Playgroud)
代替
http://petstore.swagger.io/v2/swagger.json
Run Code Online (Sandbox Code Playgroud)
如何确保在 …