【问题标题】:Building RESTful API using R [closed]使用 R 构建 RESTful API [关闭]
【发布时间】:2016-06-28 14:53:19
【问题描述】:

我正在考虑使用编程语言 R 构建一个 RESTful API,主要是为了以 API 格式向用户展示我的机器学习模型。 我知道有一些选项,例如导出到 PMML、PFA 和使用其他语言来处理 API 部分。但是,我想坚持使用相同的编程语言,想知道 R 中是否有类似 Flask/Django/Springbook 框架的东西?

我查看了servr/shiny,但我真的不认为 RESTful 是它们的设计目的。 R 中是否有更好的解决方案更易于使用?

【问题讨论】:

标签: r rest api plumber


【解决方案1】:

我有两个选择:

plumber

plumber 允许您通过装饰现有的 R 源代码来创建 REST API 带有特殊 cmets 的代码。

一个小示例文件:

# myfile.R

#* @get /mean
normalMean <- function(samples=10){
  data <- rnorm(samples)
  mean(data)
}

#* @post /sum
addTwo <- function(a, b){
  as.numeric(a) + as.numeric(b)
}

从 R 命令行:

> library(plumber)
> r <- plumb("myfile.R")  # Where 'myfile.R' is the location of the file shown above
> r$run(port=8000)

这样你会得到这样的结果:

$ curl "http://localhost:8000/mean"
 [-0.254]
$ curl "http://localhost:8000/mean?samples=10000"
 [-0.0038]

Jug

Jug 是一个小型的 R 网络开发框架,它严重依赖于 httpuv 包。它的主要重点是为您的构建 API 代码尽可能简单。它不应该是 性能特别好,也不是超级稳定的 Web 框架。其他工具 (和语言)可能更适合。它的主要重点是 轻松地允许您为您的 R 代码创建 API。然而 Jug 的灵活性意味着,理论上,您可以构建一个广泛的 带有它的 web 框架。

它很容易学习并且有一个nice vignette

Hello-World 示例:

library(jug)

jug() %>%
  get("/", function(req, res, err){
    "Hello World!"
  }) %>%
  simple_error_handler_json() %>%
  serve_it()

【讨论】:

  • 我们可以通过 oAuth 保护它吗?
  • 感谢您的回答。您能否提供 Plumber 中使用的特殊装饰器 cmets 的列表?
【解决方案2】:

这适用于那些想要将 API 开发与 R - 管道工、Rserve 和 rApache 进行比较的人。

基本上并发请求在plumber 中由httpuv 排队,因此它本身并不高效。作者建议使用多个 docker 容器,但它可能很复杂并且需要资源。

还有其他技术,例如 RserverApacheRserve forks prosesses,可以配置rApache pre-fork 处理并发请求。

查看以下帖子进行比较

https://www.linkedin.com/pulse/api-development-r-part-i-jaehyeon-kim/ https://www.linkedin.com/pulse/api-development-r-part-ii-jaehyeon-kim/

【讨论】:

  • 提到“作者”会让人觉得这些帖子不是你写的。通常情况下,不通过这样的推荐披露您的隶属关系将被视为垃圾邮件;既然你的名字在 URL 中,为什么要把它说成你不仅仅是将人们链接到你自己的作品?
  • 我写这些帖子时有同样的问题。内容很长,放不下,所以加了链接。是否是垃圾邮件可以由查看帖子的人来判断(可能还有谁能确定谁写的:))。
【解决方案3】:

添加到此答案列表中:

请查看 Jeroen Ooms 的 OpenCPU

好处:

  1. 简单明了:任何安装在 opencpu 服务器上的 R 包都可以通过 http 调用。

  2. 只需专注于创建 R 包,其余的将由 opencpu 处理。

  3. 您可以返回结果关系表绘图单个值甚至是指针(又名临时会话密钥)到 R 对象 [想象一个巨大的对象/数据集,您可以从其他更有限的平台处理/操作;)]

  4. CI/CD 将您的软件包托管在 Github 上。

  5. 如果您使用的是服务器版本,opencpu 通过利用 Nginx 进行缓存和负载平衡而设计为并发和异步。

  6. 使用 AppArmor 在 Ubuntu 上实施安全。或者如果你使用 Fedora,你可以设置公私证书认证,这要感谢后端的 Apache 服务器。感谢 rApache!

  7. 上面的太复杂了:你也可以使用opencpu::ocpu_start_app()在你的本地机器上启动一个单一的用户会话并服务你的功能(缺点是安全)

    李>
  8. 需要用户界面?只需使用 javascript 创建一个 UI,将其存储在 R 包的 www 文件夹中,用户就可以在他们的 Web 浏览器上打开它并使用您的功能。

这篇文章没有做 opencpu 正义。我真的建议你阅读他在OpenCPU顶部的链接

试一试https://cloud.opencpu.org/ocpu/testhttps://www.opencpu.org/apps.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-25
    • 2011-08-25
    • 2015-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-13
    相关资源
    最近更新 更多