Shiny应用中如何根据激活导航面板显示/隐藏selectInput?
解决Shiny中根据导航面板显示/隐藏selectInput的问题
方法一:修正conditionalPanel的判断条件
你原代码里的核心问题是conditionalPanel用错了输入ID——page_navbar生成的内置输入ID是navbar,不是nav。把条件改成input.navbar != 'intro'就能正常生效:
library(shiny) library(shinyjs) library(bslib) ui <- page_navbar( shinyjs::useShinyjs(), title = "App", header = tags$p( conditionalPanel( condition = "input.navbar != 'intro'", # 修正输入ID为navbar selectInput( inputId = "select", label = "options", choices = c("Option 1", "Option 2", "Option 3") ) ), class = "dropdown" ), nav_panel(title = "Intro", value = "intro", p("Intro")), nav_panel(title = "Panel 2", value = "panel2", p("Lorem ipsum...")), nav_panel("Panel 3", value = "panel3", p("Lorem ipsum...")) ) server <- function(input, output) {} shinyApp(ui = ui, server = server)
方法二:用shinyjs动态控制显示/隐藏
如果后续需要更复杂的判断逻辑,用shinyjs的show()和hide()函数在server端监听导航切换会更灵活:
library(shiny) library(shinyjs) library(bslib) ui <- page_navbar( shinyjs::useShinyjs(), title = "App", header = tags$p( selectInput( inputId = "select", label = "options", choices = c("Option 1", "Option 2", "Option 3") ), class = "dropdown" ), nav_panel(title = "Intro", value = "intro", p("Intro")), nav_panel(title = "Panel 2", value = "panel2", p("Lorem ipsum...")), nav_panel("Panel 3", value = "panel3", p("Lorem ipsum...")) ) server <- function(input, output, session) { # 初始加载时隐藏控件(默认显示Intro面板) shinyjs::hide("select") # 监听导航面板切换事件 observeEvent(input$navbar, { if(input$navbar %in% c("panel2", "panel3")){ shinyjs::show("select") } else { shinyjs::hide("select") } }) } shinyApp(ui = ui, server = server)
方法三:直接将selectInput放入对应面板(最直观)
如果不需要把selectInput放在全局header里,直接把它分别加到Panel 2和Panel 3的内容中,自然就只在这两个面板显示:
library(shiny) library(shinyjs) library(bslib) ui <- page_navbar( shinyjs::useShinyjs(), title = "App", nav_panel(title = "Intro", value = "intro", p("Intro")), nav_panel(title = "Panel 2", value = "panel2", selectInput("select", "options", choices = c("Option 1", "Option 2", "Option 3")), p("Lorem ipsum...") ), nav_panel("Panel 3", value = "panel3", selectInput("select", "options", choices = c("Option 1", "Option 2", "Option 3")), p("Lorem ipsum...") ) ) server <- function(input, output) {} shinyApp(ui = ui, server = server)
注意:如果保留相同的
inputId,两个面板的selectInput状态会同步;需要独立状态的话,要给它们设置不同的ID。
内容的提问来源于stack exchange,提问作者PsyR
相关产品推荐
相关产品推荐

