«Стандартный» способ остановить приложение Shiny - просто остановить процесс R, который его обслуживает. Вам нужен способ закрыть приложение без сбоев. Функция stopApp()
делает это, возвращая управление потоком обратно в основной поток вашего скрипта.
Этот пример взят со страницы справки по адресу ?runApp
, и я сделал два дополнения, прокомментированных ниже.
library(shiny)
x <- 1
while (x <= 5) {
runApp(list(
ui = bootstrapPage(
numericInput('n', 'Number of obs', 100),
plotOutput('plot'),
actionButton("done", "close") # added a close button
),
server = function(input, output) {
output$plot <- renderPlot({ hist(runif(input$n)) })
observeEvent(input$done, stopApp()) # added an observer to the close button
}
))
x <- x+1
}
Вы также можете поместить аргумент из логики c приложения Shiny в stopApp()
, чтобы использовать результат в других своих вычислениях. В этом примере, если мы хотим узнать, что вводит пользователь для n
, мы могли бы использовать stopApp(input$n)
, и все приложение вернуло бы это значение, как показано ниже.
x <- 1
while (x <= 5) {
user_input <- runApp(<code from above>)
x <- x+1
}
Важно то, что чтобы ваши пользователи поняли, что им нужно использовать кнопку «Закрыть» в приложении, а не закрывать окно браузера или кнопку «Стоп» в RStudio. Любое из этих действий прервет ваш основной скрипт.
Отредактировано для добавления:
На самом деле есть некоторые функции, встроенные в {shiny}
для прослушивания окончания сеанса пользователя (т.е. закрытие окно браузера), onStop()
и onSessionEnded()
. Вы должны проверить страницу справки для них, но замена моей строки observeEvent(...)
на onStop(stopApp)
(или onSessionEnded(stopApp)
), кажется, работает отлично. Затем вы можете удалить кнопку «Закрыть» из пользовательского интерфейса.