Shiny触发btntest事件时如何忽略input$test1的observeEvent监听?
解决方案
实现思路是新增一个响应式状态标记,区分test1的更新来源,控制默认更新逻辑的执行:
- 新增
reactiveValues类型的标记变量,默认值为FALSE,标识当前test1的更新是否来自按钮点击 - 按钮点击事件中,先将标记设为
TRUE,再更新test1的值,完成test2的2倍值赋值后再重置标记为FALSE - 原有监听
input$test1的事件中增加判断条件,仅当标记为FALSE(即用户手动修改test1)时,才执行将test2更新为3倍值的逻辑
修改后的完整代码如下:
ui <- fluidPage( # Application title titlePanel("Hello Shiny!"), fluidRow( column(width = 4, sliderInput("obs", "Number of observations:", min = 0, max = 1000, value = 500), selectizeInput("test1", label = "Dropdown", choices = 1:10), selectizeInput("test2", label = "Dropdown2", choices = NULL), actionButton("btntest", "Button1") ) ) ) # Server logic server <- function(input, output, session) { # 新增更新来源标记 myval <- reactiveValues( count = 0, trigger_from_button = FALSE ) observeEvent(input$test1, { # 仅非按钮触发的test1更新才执行默认逻辑 if (!myval$trigger_from_button) { updateSelectizeInput(session, "test2", choices = 3*as.numeric(input$test1)) } }) observeEvent(input$btntest, { myval$count <- myval$count + 1 # 先开启标记,告知后续test1更新来自按钮 myval$trigger_from_button <- TRUE updateSelectizeInput(session, "test1", choices = 1:10, selected = myval$count ) updateSelectizeInput(session, "test2", choices = myval$count * 2 ) # 操作完成后重置标记,不影响后续手动操作 myval$trigger_from_button <- FALSE }) } # Complete app with UI and server components shinyApp(ui, server)
运行后即可实现需求:手动选择test1时test2更新为对应值的3倍,点击按钮时test2更新为点击次数的2倍,不会被默认逻辑覆盖。
内容的提问来源于stack exchange,提问作者john
相关产品推荐
相关产品推荐

