如何让Shiny Dashboard的conditionalPanel仅在指定菜单项与标签页同时选中时显示
解决方案
要实现日期选择框仅在选中「Menu Item 1」且切换到「Tab 1」时显示,需要两步核心修改:
- 给内部的
tabsetPanel添加ID,让Shiny能追踪当前激活的子标签页 - 更新
conditionalPanel的条件,同时校验侧边栏菜单和子标签页的状态
修改后的完整代码
library(shiny) library(shinydashboard) library(shinyWidgets) library(lubridate) generate_dates <- function(start_date, end_date) { all_dates <- seq(start_date, end_date, by = "days") all_mondays <- all_dates[weekdays(all_dates) == "Monday"] return(all_mondays) } start_date <- floor_date(as.Date("2023-07-01"), unit = "week", week_start = 1) end_date <- floor_date(as.Date("2023-12-06"), unit = "week", week_start = 1) dates <- generate_dates(start_date, end_date) df <- data.frame( Week = dates, Value_1 = sample(c("A", "B", "C", "D"), length(dates), replace = TRUE), Value_2 = sample(c("X", "Y", "Z", "W"), length(dates), replace = TRUE) ) sidebar <- dashboardSidebar( sidebarMenu( id= "sidebarID", conditionalPanel( # 同时校验侧边栏菜单和内部标签页状态 condition="input.sidebarID == 'menu1' && input.innerTabID == 'Tab 1'", dateRangeInput("date_range","Select Date Range", start=max(df$Week), end=max(df$Week), min=max(df$Week), max=max(df$Week), format="yyyy-mm-dd" ) ), menuItem("Menu Item 1",tabName="menu1"), menuItem("Menu Item 2",tabName="menu2") ) ) body<- dashboardBody( tabItems( tabItem(tabName="menu1", # 给tabsetPanel添加ID,用于追踪当前激活的标签页 tabsetPanel( id = "innerTabID", tabPanel("Tab 1"), tabPanel("Tab 2") )), tabItem(tabName="menu2") ) ) ui<-dashboardPage( dashboardHeader(title="Navigation"), sidebar, body ) server<-function(input,output,session){ } shinyApp(ui,server)
关键修改说明
- 给tabsetPanel添加ID:在
tabsetPanel中加入id = "innerTabID",Shiny会自动生成input.innerTabID输入值,实时对应当前选中的子标签页名称。 - 更新条件判断:将
conditionalPanel的条件改为input.sidebarID == 'menu1' && input.innerTabID == 'Tab 1',只有当两个条件同时满足时,日期选择框才会显示。
内容的提问来源于stack exchange,提问作者Tuo
相关产品推荐
相关产品推荐

