如何在Shiny应用中获取bslib::nav_insert生成的动态激活标签页名称
解决bslib动态标签页激活状态无法捕获的问题
问题根源
用bslib::nav_insert动态添加标签页时,如果不给nav_panel显式指定id参数,bslib会自动生成随机内部ID,而非使用标签标题作为ID。这就导致page_navbar的id对应的input$all_tabs无法捕获动态标签页的激活状态,只会返回NULL。而静态标签页默认以标题作为ID,因此能正常被识别。
修复方法
动态创建nav_panel时,手动设置id参数,让ID与标签标题保持一致(或使用你需要的唯一标识),这样page_navbar就能正确跟踪所有标签页的激活状态。
修改后的完整代码
library(shiny) library(bslib) all_forms <- c("Dynamic Tab1", "Dynamic Tab2") ui <- fluidPage( bslib::page_navbar( id = "all_tabs", sidebar = bslib::sidebar(textOutput("active_tab")), bslib::nav_panel("static tab") ) ) server <- function(input, output, session) { lapply(all_forms, \(i){ bslib::nav_insert( id = "all_tabs", # 显式指定nav_panel的id与标题一致 bslib::nav_panel(title = i, id = i) ) }) output[["active_tab"]] <- renderText({ input$all_tabs }) } shinyApp(ui, server)
效果验证
修改完成后,无论是切换到静态标签页还是动态添加的标签页,侧边栏都会正确显示当前激活的标签名称,input$all_tabs也能正常获取到对应的标签ID(此处即标题文本)。
内容的提问来源于stack exchange,提问作者Leon Samson
相关产品推荐
相关产品推荐

