R Shiny - Как сломать лапу, не останавливая приложение? - PullRequest
0 голосов
/ 20 января 2020

Приложение ниже содержит actionButton, который вызывает lapply при нажатии. lapply циклически перебирает числа 2-4 и останавливается, если x %% 2 не равно 0. Можно ли сломать lapply без остановки основного приложения?

library(shiny)

ui <- fluidPage(
  actionButton(inputId = "go", label = "Start"),
  div(id = 'placeholder')
)

server <- function(input, output, session) {

  observeEvent(input$go, {

    lapply(2:4, function(x) {

      res = x %% 2

      if(res == 0){

        return(x)

      } else {

        insertUI('#placeholder', ui = tags$p('There was an error.'))

        stop('Error')
      }
    })
  })

}

shinyApp(ui = ui, server = server)

req is не вариант, так как мне нужно вставить некоторый пользовательский интерфейс непосредственно перед завершением l oop, если условие x %% 2 == 0 не выполнено.

Я нашел подобный вопрос здесь: Возможно ли прекратить выполнение кода R внутри блеска (без остановки процесса блеска)? . Но он полагается на пользовательский ввод, чтобы остановить выполнение, и я не уверен, как изменить его в этом примере. Я также не могу попытаться изменить его, потому что parallel недоступно для R версии 3.6.0. Я также видел этот пост, на который ссылаются здесь: https://github.com/rstudio/shiny/issues/1398, но я думаю, что он также требует ввода данных пользователем.

1 Ответ

0 голосов
/ 20 января 2020

В зависимости от точных требований вашего приложения, возможно, вы можете использовать «обычный» l oop и использовать break, чтобы остановить выполнение l oop. Кроме того, вы можете заключить его в try вызов:

server <- function(input, output, session) {

  observeEvent(input$go, {

    try(lapply(2:4, function(x) {

      res = x %% 2

      if(res == 0){

        return(x)

      } else {

        insertUI('#placeholder', ui = tags$p('There was an error.'))

        stop('Error')
      }
    }), silent=T)
  })

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...