首页 > 解决方案 > 您如何检查 R Shiny 中的所有后代是否都是干净的(未失效)?

问题描述

假设我在 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"
    # ...
    # ...
  }
})

标签: rshinyshinydashboardshiny-reactivity

解决方案


观察者一直在倾听变化。鉴于您在其中有预设值,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) 

推荐阅读