Shiny 1.6.0中bindEvent绑定多个输入的实现方法问询
解决Shiny中bindEvent绑定多事件监听器的问题
在Shiny 1.6.0及之后版本中,使用bindEvent绑定多个输入事件时,只需将多个输入组合成一个反应式表达式传入bindEvent的第一个参数即可,无需在observe内部重复监听输入。
正确示例代码
library(shiny) ui <- fluidPage( numericInput("a", "Input A", value = 1), numericInput("b", "Input B", value = 2), verbatimTextOutput("output") ) server <- function(input, output, session) { observe({ output$output <- renderPrint({ cat("Something changed: a~", input$a, " or b~", input$b) }) }) %>% bindEvent(c(input$a, input$b), ignoreInit = TRUE, ignoreNULL = FALSE) } shinyApp(ui, server)
其他可行写法
如果觉得用c()不够直观,也可以用大括号包裹多个输入表达式,效果完全一致:
bindEvent({input$a; input$b}, ignoreInit = TRUE, ignoreNULL = FALSE)
为什么之前的写法会报错
- 直接在
observe内部写input$a; input$b会让observe本身监听这两个输入,再叠加bindEvent会导致反应式上下文冲突,引发错误。 observeEvent(c(input$a, input$b), {code})是将触发逻辑和执行逻辑写在一处,而bindEvent是通过管道分离触发条件和执行逻辑,两者的参数逻辑不同,不能直接照搬。
关于bindCache的问题
bindCache的作用是缓存反应式输出,它不会主动监听输入变化,因此无法替代bindEvent实现多事件触发的需求,两者的应用场景完全不同。
内容的提问来源于stack exchange,提问作者Aaron C
相关产品推荐
相关产品推荐

