r - Shiny 服务器: socket hang up

标签 r node.js shiny r-markdown shiny-server

更新:我添加了下面的解决方案

问题

一点背景:我在 Ubuntu 服务器上运行 Shiny 服务器 v1.5。基本上我有一个 rmarkdown 页面,允许用户使用一些参数,然后有一个下载按钮,使用 Shiny 生成文档,如下所示:

```{r,echo=FALSE}
downloadHandler(
  filename = "report.pdf",
  content = function(file) {
    knitr::knit2pdf("report.Rnw",envir=environment())
    file.rename(normalizePath('report.pdf'), file)
  }
)
```

Shiny 应用程序在我的本地计算机上运行良好,但在服务器上崩溃。更具体地说,r markdown 网页工作正常,但是一旦我单击下载按钮,应用程序就会在大约 30 秒后崩溃。服务器日志显示套接字超时错误:

[2016-02-24 03:38:52.240] [INFO] shiny-server - Starting listener on 0.0.0.0:3838
[2016-02-24 03:49:30.183] [ERROR] shiny-server - Uncaught exception: Error: socket hang up
[2016-02-24 03:49:30.184] [ERROR] shiny-server - Error: socket hang up
    at createHangUpError (_http_client.js:215:15)
    at Socket.socketCloseListener (_http_client.js:247:23)
    at Socket.emit (events.js:129:20)
    at TCP.close (net.js:485:12)
[2016-02-24 03:49:30.184] [INFO] shiny-server - Stopping listener on 0.0.0.0:3838
[2016-02-24 03:49:30.185] [INFO] shiny-server - Shutting down worker processes (with notification)
/opt/shiny-server/lib/main.js:364
  throw err;
        ^
Error: socket hang up
    at createHangUpError (_http_client.js:215:15)
    at Socket.socketCloseListener (_http_client.js:247:23)
    at Socket.emit (events.js:129:20)
    at TCP.close (net.js:485:12)

这个 pdf 需要相当长的时间才能生成(大约五分钟),所以我怀疑我在某个地方错过了一些超时参数。这就是我在 Shiny 的配置中所做的:

run_as shiny;
app_init_timeout 999999;
app_idle_timeout 999999;

# Define a server that listens on port 3838
server {
  listen 3838;
  ....
}

...但无济于事,因为我仍然收到错误。任何建议将不胜感激!

解决方案

正如 @daattali 所提到的,你不能让 downloadButton 中的某些内容花费那么长时间,更改服务器设置不会改变任何内容。因此,我最终将生成和下载功能分为两部分,如下所示:

```{r, echo=FALSE}
shinyApp(
  ui = fluidPage(
    fluidRow(
      column(2,
        conditionalPanel(
          condition = "!$('makeReport').hasClass('shiny-busy')",
          actionButton("makeReport","Generate Report",icon=icon("file"))
        )
      ),
      column(4,
      conditionalPanel(
        condition = "!$('makeReport').hasClass('shiny-busy')",
        uiOutput("downloadButton")
        #downloadButton("downloadReport", "Download Report")
      )
      )
    )
  ),
  server = function(input, output) {
    output$download_button <- renderUI({
        downloadButton("downloadReport", "Download Results")
     })
    makeReportAction <- eventReactive(input$makeReport, {
        ...
        knitr::knit2pdf("report.Rnw",envir=globalenv())
    })
    output$downloadButton <- renderUI({
      makeReportAction() #only appear after first click on generate
      downloadButton("downloadReport", "Download Report")
    })
    output$downloadReport <- downloadHandler(
      filename = "report.pdf",
      content = function(file) {
        cat(paste("Does the pdf exist?",file.exists("report.pdf")))
        file.rename(normalizePath('report.pdf'), file)
      }
    )
  }
)
```

最佳答案

这可能与上周其他人在 Google 董事会上向 Joe Cheng 询问的问题相同

https://groups.google.com/forum/#!topic/shiny-discuss/4bL9jFaYly0

下载处理程序似乎有时间限制,因此也许尝试看看是否可以预先生成文件并仅在单击按钮时提供文件

关于r - Shiny 服务器: socket hang up,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35586938/

相关文章:

r - Shiny 问题 - 跟踪多用户环境中的用户设置

r - 从列表向量 monitoR 中提取 S4 对象

node.js - Sequelize.js - 如何正确使用关联的 get 方法(每次调用都没有 sql 查询)?

r - 如何根据使用 shinyWidgets 在 pickerInput 中键入字母来获得搜索选项?

html - 滚动后 Shiny 的页面跳转

r - 如何让用户在 R Shiny 中的 ggplot2 和 gVis 图之间切换?

r - 在 ggplot 中,如何为 stat_bin2d 获取两个图例 ("gradient"类型)?

用于将子字符串的所有实例移动到开头的正则表达式

javascript - 如何使用 Bookshelf 在单个事务中处理和更新集合中的所有模型?

javascript - 在 Javascript 中将数字转换为固定数字表示形式