8

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

可以以这种方式使用闪亮服务器吗?

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

非常感谢!

4

5 回答 5

8

我今天发现了另一个包装 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)
于 2015-07-16T12:54:50.040 回答
7

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

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

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

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

Rook定义了 R 应用程序和 Web 服务器之间的接口。这使得交付具有正确内容类型的 JSON 有效负载变得容易。

其他选项包括:

于 2014-10-14T14:01:17.613 回答
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))
  })
})

用户界面

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 提供服务。

于 2013-11-15T02:25:35.323 回答
1

黑客闪亮怎么样。

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/

于 2015-12-10T10:02:43.820 回答
1

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

用户界面

verbatimTextOutput(outputId="jsonoutput")

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

output$jsonoutput <- renderText({

data <- getMainData()


result <- jsonlite::prettify(jsonlite::toJSON(data, auto_unbox = TRUE), 4)

return(result)
})
于 2016-12-08T16:56:09.097 回答