Обновление: Я добавил раствор нижеБлестящая сервер: гнездо повесить
Проблема
Немного предыстории: Я бегу Блестящая v1.5 сервера в точном сервере Ubuntu. В принципе у меня есть страница rmarkdown, которая позволяет пользователю играть с некоторыми параметрами, а затем имеет кнопку загрузки, который создает документ, используя блестящие, как так:
```{r,echo=FALSE}
downloadHandler(
filename = "report.pdf",
content = function(file) {
knitr::knit2pdf("report.Rnw",envir=environment())
file.rename(normalizePath('report.pdf'), file)
}
)
```
Блестящая приложение отлично работает на моей локальной машине, но падает на сервер. Более конкретно, веб-страница 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 занимает довольно много времени, чтобы генерировать (около пяти минут), так что я заподозрить, что я пропустил некоторое время ожидания параметр где-нибудь. Это то, что я сделал в своей блестящей конфигурации:
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)
}
)
}
)
```