Предотвратить блестящее приложение от разрыва цикла - PullRequest
2 голосов
/ 18 февраля 2020

Я пытаюсь запустить блестящее приложение через некоторое время l oop. При выходе из приложения время l oop прерывается. Есть ли способ остаться в пределах l oop при выходе из приложения?

Вот пример проблемы. Файл app.R - это приложение, созданное при создании нового блестящего приложения.

library(shiny)

x <- 1

while(x<=5){

  runApp("app.R")

  x <- x+1

}

1 Ответ

2 голосов
/ 18 февраля 2020

«Стандартный» способ остановить приложение 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)), кажется, работает отлично. Затем вы можете удалить кнопку «Закрыть» из пользовательского интерфейса.

...