引入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
相关产品推荐
相关产品推荐

