如何获取Shiny导航栏中当前激活的主标签页与子标签页?
不用预先指定子标签的input ID,我们可以通过JavaScript监听标签切换事件,把主标签和当前激活的子标签信息统一传给Shiny,实现你要的效果。以下是完整示例代码:
library(shiny) ui <- navbarPage( title = "标签状态测试", id = "main_nav", # 给主导航设置ID,可作为状态获取的备用方案 tabPanel("tab 1", navbarMenu("子标签组1", tabPanel("子标签A", "内容A"), tabPanel("子标签B", "内容B"), tabPanel("子标签C", "内容C") ) ), tabPanel("tab 2", navbarMenu("子标签组2", tabPanel("子标签X", "内容X"), tabPanel("子标签Y", "内容Y") ) ), tabPanel("无标签页", "这是没有子标签的页面"), # 添加自定义JS脚本,监听标签切换 tags$script(HTML(" // 页面加载完成后初始化状态 $(document).ready(function() { updateActiveTabs(); // 监听主标签点击事件 $('.navbar-nav > li > a').on('click', function() { setTimeout(updateActiveTabs, 100); // 延迟确保标签切换DOM更新完成 }); // 监听子标签点击事件 $('.navbar-nav .dropdown-menu li a').on('click', function() { setTimeout(updateActiveTabs, 100); }); }); // 组装并发送当前激活的标签状态 function updateActiveTabs() { // 获取当前激活的主标签文本 var mainTab = $('.navbar-nav > li.active > a').text().trim(); // 获取当前激活的子标签文本(存在时) var subTab = $('.navbar-nav .dropdown-menu li.active > a').text().trim(); var statusText; if (subTab) { statusText = '选中' + mainTab + '且选中子标签' + subTab; } else { statusText = '选中' + mainTab; } // 将状态传递给Shiny的input$active_tabs Shiny.setInputValue('active_tabs', statusText); } ")) ) server <- function(input, output, session) { # 实时监听并打印当前标签状态 observe({ print(input$active_tabs) # 可在此处根据状态添加业务逻辑 }) } shinyApp(ui, server)
关键说明:
- JS通过DOM选择器直接获取激活标签的文本,无需提前知道所有子标签的ID,完全通用。
setTimeout是为了等待Shiny完成标签切换的DOM更新,避免获取到旧的状态值。- 最终通过
Shiny.setInputValue将组合好的状态文本传给Shiny,你可以在server端直接监听input$active_tabs获取结果。
测试时切换任意主/子标签,控制台会输出类似“选中tab 1且选中子标签B”的状态文本,完全匹配你的需求。
内容的提问来源于stack exchange,提问作者nimliug
相关产品推荐
相关产品推荐

