如何在bslib的page_navbar中添加右侧嵌套侧边栏
嘿,我懂你现在的需求——想用page_navbar的时候,同时保留左侧的默认展开侧边栏,再加一个默认闭合的右侧侧边栏对吧?你之前嵌套layout_sidebar的思路方向是对的,但没找对嵌套的位置,所以没达到预期效果。我给你捋清楚正确的做法,分两种常见场景给你代码示例:
场景1:每个导航页配独立的右侧侧边栏
如果不同的导航标签页需要不一样的右侧侧边栏内容,那你要把每个nav_panel的具体内容用layout_sidebar包裹,在这个布局里定义右侧侧边栏:
library(bslib) library(shiny) id <- "hi" ns <- NS(id) ui <- page_navbar( id = ns("navbar"), title = "Example App", # 原来的左侧全局侧边栏 sidebar = sidebar( id = ns("sidebar"), open = "open", "左侧侧边栏内容" ), # Overview页面,带专属右侧侧边栏 nav_panel( title = "Overview", layout_sidebar( # 页面的主内容区 h1("Overview"), # 右侧侧边栏:设置position为right,open设为FALSE默认闭合 sidebar = sidebar( "右侧侧边栏(Overview页)", position = "right", open = FALSE, id = ns("right_sidebar_overview") ) ) ), # Table页面,同样配置右侧侧边栏 nav_panel( title = "Table", layout_sidebar( h1("Table"), sidebar = sidebar( "右侧侧边栏(Table页)", position = "right", open = FALSE, id = ns("right_sidebar_table") ) ) ) ) shinyApp(ui, server = function(input, output) {})
场景2:全局统一的右侧侧边栏
如果所有导航页都共用同一个右侧侧边栏,那可以用page_navbar的main参数,把全局布局(包含右侧侧边栏)和所有导航内容整合在一起:
library(bslib) library(shiny) id <- "hi" ns <- NS(id) ui <- page_navbar( id = ns("navbar"), title = "Example App", # 左侧全局侧边栏 sidebar = sidebar( id = ns("sidebar"), open = "open", "左侧侧边栏内容" ), # 全局主布局:把右侧侧边栏和所有导航页都包进来 main = layout_sidebar( # 全局右侧侧边栏,默认闭合 sidebar = sidebar( "全局右侧侧边栏", position = "right", open = FALSE, id = ns("right_sidebar_global") ), # 用navset_card_tab来承载所有导航页,和page_navbar的导航逻辑匹配 navset_card_tab( nav_panel("Overview", h1("Overview")), nav_panel("Table", h1("Table")) ) ) ) shinyApp(ui, server = function(input, output) {})
为啥你之前的尝试没成功?
你之前直接把layout_sidebar嵌套在page_navbar的顶层了,但page_navbar的顶层只接受导航相关的元素(比如nav_panel、sidebar这类参数),布局组件得放在导航面板内部或者main参数里,不能直接当顶层子元素,这就是问题所在~
备注:内容来源于stack exchange,提问作者Julian
相关产品推荐
相关产品推荐

