You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

引入conditionalPanel后bsCollapsePanel名称重复致tab同步失效问题

bsCollapse与tabsetPanel同步失效:引入conditionalPanel后input$panels重复面板名称

问题说明

原本实现了bsCollapse折叠面板和tabsetPanel标签页的状态同步——切换折叠面板时对应标签页自动激活,切换标签页时对应折叠面板自动展开,功能正常。但在bsCollapsePanel("A")中加入conditionalPanel组件后,input$panels会重复返回当前打开的面板名称(例如变为c("A", "A")),导致updateTabsetPanel无法正常切换到对应标签页。

重现代码

library(shiny)
library(shinyBS)

shinyApp(
  ui <- fluidPage(
    sidebarLayout(
      sidebarPanel(
        bsCollapse(id = "panels",
          bsCollapsePanel("A",
            "This is panel A",
            selectInput("select", "select", choices = c(0, 1, 2, 3)),
            conditionalPanel(condition = "input.select != 0",
              selectInput("select_update", "select_update", choices = NULL)
            )
          ),
          bsCollapsePanel("B", "This is panel B"),
          bsCollapsePanel("C", "This is panel C"),
          bsCollapsePanel("D", "This is panel D")
        )
      ),
      mainPanel(
        verbatimTextOutput("panel_opened"),
        tabsetPanel(id = "tabs",
          tabPanel("A", "This is tab A"),
          tabPanel("B", "This is tab B"),
          tabPanel("C", "This is tab C"),
          tabPanel("D", "This is tab D")
        )
      )
    )
  ),
  server <- function(session, input, output) {
    observeEvent(input$panels, {
        open_panel <- input$panels
        output$panel_opened <- renderPrint({print(open_panel)})
        updateTabsetPanel(session, "tabs", selected = open_panel)
    })
    observeEvent(input$tabs, {
      selected_tab <- input$tabs
      updateCollapse(session, "panels", open = selected_tab)
    })
    observeEvent(input$select, {
      if (input$select == 1) {
        updateSelectInput(session, "select_update", choices = c(10, 100, 1000))
      } else if (input$select == 2) {
        updateSelectInput(session, "select_update", choices = c(20, 200, 2000))
      } else if (input$select == 3) {
        updateSelectInput(session, "select_update", choices = c(30, 300, 3000))
      }
    })
  }
)

临时解决方案

无法直接修正input$panels的重复值问题,但可以通过提取input$panels的最后一个元素来获取当前激活的面板名称,从而恢复同步功能。修改observeEvent(input$panels)中的代码:

observeEvent(input$panels, {
    open_panel <- tail(input$panels, 1) # 提取最后一个元素
    output$panel_opened <- renderPrint({print(open_panel)})
    updateTabsetPanel(session, "tabs", selected = open_panel)
})

内容的提问来源于stack exchange,提问作者toxin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 18:21:20