【问题标题】:shiny-server. Print JSON as a result output闪亮的服务器。打印 JSON 作为结果输出
【发布时间】:2013-11-28 06:57:23
【问题描述】:

我正在尝试使用 shiny-server 作为进程服务器:接收 URL 请求,处理 R 子例程并输出 JSON 作为结果。但我一直无法以 JSON 格式将输出直接打印到浏览器。

可以这样使用shiny-server吗?

PD:我知道这不是闪亮服务器的典型用途

非常感谢!

【问题讨论】:

  • Alex,你有没有找到一个好的解决方案来从启用 JSON 的 Web 服务调用 R 代码?
  • 嗨@Andrew,我解决这个问题的最后一种方法是使用Apache2+PHP 处理请求,并使用shell_exec() 从PHP 调用我的R 脚本。这些 R 脚本接受 JSON 文件中的输入并以相同的方式返回数据。 Shiny-server 在这种情况下没有帮助。
  • 谢谢。我假设虽然使用这种方法,但对于每个 PHP 调用,您必须为 R 运行时产生 2-3 秒的启动时间。
  • 在我们的服务器上调用 R 更快。我们还为请求实现了缓存,让一切变得更快

标签: r rest shiny json-rpc shiny-server


【解决方案1】:

这个简单的解决方案怎么样?

https://gist.github.com/sckott/7478126

服务器.r

require(shiny)
require(RJSONIO)

shinyServer(function(input, output) {
  output$jsonoutput <- renderText({
    toJSON(list(a = 10, b = 12))
  })
})

ui.r

require(shiny)

shinyUI(bootstrapPage(
  mainPanel(
   textOutput(outputId="jsonoutput")
  )
))

文字打印不漂亮,但是...

另外,请查看 Shiny 邮件列表中的这个答案:https://groups.google.com/forum/#!searchin/shiny-discuss/json$20output/shiny-discuss/-JYOXAeLCtI/kslvMve_FmIJ - Shiny 并不是真正设计用于将数据作为 API 提供。

【讨论】:

  • 嗨,Scott,我曾尝试过类似的方法,但是当您从另一个程序(即 PHP)发出请求时效果不佳,shiny 的 javascript 代码无法运行并且页面显示没有内容。
  • 这不会返回原始 JSON。它返回一个加载输出的闪亮 HTML 页面。在 Web 浏览器中,它在外观上是相同的,但它不适用于作为 RESTful Web 服务的编程用途。
  • @Jason 是的,我知道。我在回答中确实提到了这一点。
  • @AlexA。如果你想要一个基于 R 的 REST 服务,试试 OpenCPU opencpu.org
【解决方案2】:

听起来您正在尝试使用闪亮的服务器构建 REST 或 JSON-RPC Web 服务。目前这是不可能的(使用 Shiny Server v1.2)。

Shiny 服务器呈现一个文本/html 模板 (shinyUI) 页面并使用 WebSocket 回调来填充内容。 @ScottChamberlain 的答案将在 Web 浏览器的 HTML 正文中呈现 JSON。这不适用于程序化网络请求。

我发现rApacheRookRJSONIO 是用于 JSON Web 服务的强大且高性能的解决方案。您需要熟悉配置 Apache Web 服务器,并根据您的平台构建 Apache 模块。

rApache 是一个将 R 嵌入到 Apache Web 服务器中的模块,允许您托管 Rook、brew 和其他 R 框架。

Rook 定义了 R 应用程序和 Web 服务器之间的接口。这样可以轻松交付具有正确内容类型的 JSON 有效负载。

其他选项包括:

  • OpenCPU - 明确支持 JSON RPC 的专用 R HTTP 服务器
  • node-rio - 连接 RServe 的 node.js 服务器
  • FastRWeb - 用于将 Web 服务器连接到 RServe 的 CGI 或 PHP 接口
  • RServe - 二进制 R TCP/IP 服务器
  • httpuv - R 的 HTTP 和 WebSocket 服务器库
  • R 内置于 rhttpd - 不推荐用于生产环境

【讨论】:

  • 很好的答案。在您的选项列表中,我会添加 RServehttpuv。虽然它们都是低级的,但它们可以很容易地用于解决所述问题
【解决方案3】:

我今天发现了另一个包装 R 函数 RPC/REST-ish 的包:

https://github.com/trestletech/plumber

通过像这样注释 R 函数:

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

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

您可以将其公开为 web api:

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

【讨论】:

    【解决方案4】:

    黑客闪亮怎么样。

    httpHandler = function(req){
     message = list(value="hello")
     return(list(status = 200L,
                 headers = list('Content-Type' = 'application/json'),
                 body = toJSON(message)))
    }
    shiny:::handlerManager$addHandler(shiny:::routeHandler("/myEndPoint",httpHandler) , "a_unique_id")
    
    # then start your shiny app ...
    

    然后将浏览器指向http://127.0.0.1:[shinyport]/myEndPoint/

    【讨论】:

      【解决方案5】:

      对我来说,它通过使用逐字文本输出来工作:

      ui.R

      verbatimTextOutput(outputId="jsonoutput")
      

      server.R - 假设要转换成 json 的数据是由 getMainData() 返回的

      output$jsonoutput <- renderText({
      
      data <- getMainData()
      
      
      result <- jsonlite::prettify(jsonlite::toJSON(data, auto_unbox = TRUE), 4)
      
      return(result)
      })
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-04-17
        • 1970-01-01
        • 1970-01-01
        • 2016-12-28
        • 1970-01-01
        • 2020-03-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多