Как проверить, все ли потомки чисты (не признаны недействительными) в R Shiny? - PullRequest
0 голосов
/ 22 апреля 2020

Предположим, у меня есть наблюдатель в Shiny, подобный следующему:

observe({
  input$obs_1
  input$obs_2
  input$obs_3

  # do "something"
  # ...
  # ...

  # If the code above finished doing "something," set a reactive value
  rv$something_is_done <- FALSE
  rv$something_is_done <- TRUE
})

Наблюдатель выше будет делать "что-то" каждый раз, когда obs_1, obs_2 или obs_3 меняется.

Как я могу проверить, все ли входы закончили изменение, и кодовый блок do something завершил свой курс в последний раз?

Как только наблюдатель вернется к «бездействующий» (возвращается к прослушиванию на трех входах), я хочу, чтобы реактивное значение в конце, rv$something_is_done, вызвало в результате «другую вещь», возможно с чем-то вроде ниже:

observe({
  rv$something_is_done
  if(rv$something_is_done) {
    # do "another thing"
    # ...
    # ...
  }
})

1 Ответ

1 голос
/ 22 апреля 2020

Наблюдатели постоянно слушают изменения. Учитывая, что у вас есть предустановленные значения в obs_1, obs_2,..., он обращает на них внимание. Таким образом, он не знает или не заботится, если вы считаете, что другие 2 входа ждут изменения или нет. Что вы можете сделать, так это отложить эту реакцию на debounce, если хотите. Обратите внимание, что он установлен на 3 секунды ожидания после того, как все параметры были установлены. Я добавил 3 переменные в список, чтобы вы могли использовать их позже как mystuff_d()

library(shiny)
library(magrittr)

ui <- fluidPage(
    sliderInput("obs_1", "obs_1", min = 0, max = 1000, value = 500),
    sliderInput("obs_2", "obs_2", min = 0, max = 1000, value = 500),
    sliderInput("obs_3", "obs_3", min = 0, max = 1000, value = 500)
)

rv <- reactiveValues(something_is_done <- FALSE)

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

    mystuff <- eventReactive(c(input$obs_1,input$obs_2,input$obs_3),{
        rv$something_is_done <- FALSE
        c(input$obs_1,input$obs_2,input$obs_3)
    },ignoreInit = TRUE)

    mystuff_d <- mystuff %>% debounce(3000)

    observeEvent(mystuff_d(),{
        print(mystuff_d())
        # do "something"
        # ...
        # ...
        rv$something_is_done <- TRUE
    })

    observeEvent(rv$something_is_done,{
       if(rv$something_is_done){
           # do "another thing"
           # ...
           # ...
           print("another thing")
       }
    },ignoreInit = TRUE)

}
shinyApp(ui=ui,server = server) 
...