为什么 `observe` 和 `observeEvent` 在输入变量变化时表现不同?

Why does `observe` and `observeEvent` behave differently on change of input variable?

我发现了一个至少在 Shiny 中令人困惑的行为,我想弄清楚它发生的原因。

我有一个闪亮的应用程序,只有一个 selectInput 输入,允许选择多个值 (multiple = TRUE) 和两个监听输入变量变化的观察者:一个使用 observeEvent 直接在输入变量上,一个只使用 observe 和它体内的输入变量。

奇怪的是,在多个选项中,一个删除了选择器中的所有选项。在这种情况下,只有 observe 代码块会执行,而 observeEvent 不会。

Shiny 为什么要这么做?它应该那样工作吗?

一个最小的工作示例(您只需要取消选择所有变量):

library(shiny)

ui <- fluidPage(
    selectInput("select", 
                label = "Multiple choices",
                choices = c(1, 2, 3, 4),
                selected = c(1, 2), 
                multiple = TRUE)
)

server <- function(input, output) {
    # Won't execute with no value selected
    observeEvent(input$select, {
        vec_str <- paste(input$select, collapse = " ")
        print(paste("observeEvent:", vec_str))
    })
    
    # Will execute with no value selected
    observe({
        vec_str <- paste(input$select, collapse = " ")
        print(paste("observe:", vec_str))
    })
}

shinyApp(ui = ui, server = server)

提前致谢:)

observeEvent 中有一个设置允许您在 is.null(input$select) 时忽略大小写。设置参数 ignoreNULL = FALSE 即可获得所需的结果。

library(shiny)

ui <- fluidPage(
  selectInput("select", 
              label = "Multiple choices",
              choices = c(1, 2, 3, 4),
              selected = c(1, 2), 
              multiple = TRUE)
)

server <- function(input, output) {
   # executes even when input$select is NULL
  observeEvent(input$select, {
    vec_str <- paste(input$select, collapse = " ")
    print(paste("observeEvent:", vec_str))
  }, ignoreNULL = FALSE)
  
  # Will execute with no value selected
  observe({
    vec_str <- paste(input$select, collapse = " ")
    print(paste("observe:", vec_str))
  })
}

shinyApp(ui = ui, server = server)