Shiny中移除同名tabPanel时仅删除当前选中标签页的方法
问题:Shiny中实现仅删除当前选中的同名标签页
需求:
- 允许存在多个标题相同的
tabPanel - 点击
remove按钮仅删除当前选中的标签页
尝试的代码存在问题:选中最后一个“Python”标签页点击删除时,所有标题为“Python”的标签页都会被删除。
原代码:
ui <- fluidPage( sidebarLayout( sidebarPanel( actionButton("add", "Add Other tab"), actionButton("remove", "Remove Current tab") ), mainPanel( tabsetPanel(id = "tabs" ,tabPanel("Java", "tab for Java") ,tabPanel("C++", "tab for C++") ,tabPanel("Python", "tab for Python") ,tabPanel("Python", "tab for Python") ) ) ) ) server <- function(input, output, session) { observeEvent(input$add, { insertTab(inputId = "tabs", tabPanel("Other language", "tab for other language"), select=TRUE ) }) observeEvent(input$remove, { removeTab(inputId = "tabs", target = input$tabs) }) } shinyApp(ui, server)
解决方案
核心问题是input$tabs默认返回标签的标题文本,当存在同名标签时,removeTab会匹配所有标题一致的标签。解决方法是给每个tabPanel设置唯一的value参数,让input$tabs返回当前选中标签的唯一标识,删除时仅针对该标识对应的标签操作。
修正后的代码:
ui <- fluidPage( sidebarLayout( sidebarPanel( actionButton("add", "Add Other tab"), actionButton("remove", "Remove Current tab") ), mainPanel( tabsetPanel( id = "tabs", tabPanel("Java", "tab for Java", value = "java_1"), tabPanel("C++", "tab for C++", value = "cpp_1"), tabPanel("Python", "tab for Python", value = "python_1"), tabPanel("Python", "tab for Python", value = "python_2") ) ) ) ) server <- function(input, output, session) { # 用于生成新增tab的唯一value tab_counter <- reactiveVal(3) observeEvent(input$add, { tab_counter(tab_counter() + 1) new_tab_value <- paste0("other_", tab_counter()) insertTab( inputId = "tabs", tabPanel("Other language", "tab for other language", value = new_tab_value), select = TRUE ) }) observeEvent(input$remove, { if (!is.null(input$tabs)) { removeTab(inputId = "tabs", target = input$tabs) } }) } shinyApp(ui, server)
说明
- 初始的每个
tabPanel都添加了唯一的value参数(如python_1、python_2),标题可保持相同 - 新增标签时,通过
tab_counter生成唯一的value,确保每个新增标签都有独一标识 - 删除时,
input$tabs返回当前选中标签的唯一value,removeTab只会删除该值对应的标签,不会影响同名其他标签
内容的提问来源于stack exchange,提问作者Lev
相关产品推荐
相关产品推荐

