shiny的服务器:sockets挂断

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

问题

一点背景:我正在Ubuntu精确服务器上运行Shiny server v1.5。 基本上我有一个rmarkdown页面,允许用户使用某些参数进行播放,然后有一个下载button,使用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降价网页工作正常,但一旦我点击下载button,应用程序约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的configuration中所做的:

 run_as shiny; app_init_timeout 999999; app_idle_timeout 999999; # Define a server that listens on port 3838 server { listen 3838; .... } 

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

解决scheme

正如@daattali所提到的,你不能在downloadButton里面花太多时间,改变服务器设置不会改变任何事情。 所以我最终分裂成了两部分的生成和下载function,如下所示:

 ```{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

它看起来像下载处理程序有一个时间限制,所以也许尝试看看是否有可能事先生成文件,只有当button被点击时提供文件