bs4Dash中嵌套uiOutput卡片宽度异常及controlbar设置报错求助
问题1:嵌套uiOutput生成的卡片宽度不符合预期
问题描述
通过uiOutput创建Tab 1内容,其中嵌套的uiOutput生成的卡片无法达到预期的栅格布局宽度。
原因分析
当前代码中,fluidRow直接包含三个uiOutput,而每个uiOutput的返回值是column(4, bs4Card(...))。由于uiOutput本身会生成一个额外的<div>容器,导致column(4)被包裹在这个div内,破坏了Bootstrap栅格系统的层级结构,卡片无法正确继承栅格宽度。
解决方案
调整结构,将column放在fluidRow中直接包裹uiOutput,每个uiOutput仅返回bs4Card组件:
修改后的server部分代码:
server <- function(input, output) { output$tab_data = renderUI({ fluidRow( column(width = 4, uiOutput("column_1")), column(width = 4, uiOutput("column_2")), column(width = 4, uiOutput("column_3")) ) }) # column 1 output$column_1 = renderUI({ bs4Card( title = div("Card 1", style='color:black; font-size:18px;'), id = "card_1", width = NULL, height = "720px", p("Text") ) }) # column 2 output$column_2 = renderUI({ bs4Card( title = div("Card 2", style='color:black; font-size:18px;'), id = "card_2", width = NULL, height = "720px", p("Text") ) }) # column 3 output$column_3 = renderUI({ bs4Card( title = div("Card 3", style='color:black; font-size:18px;'), id = "card_3", width = NULL, height = "720px", p("Text") ) }) }
调整后栅格层级正确,卡片会按照column(4)的宽度渲染,符合预期。
问题2:通过uiOutput设置controlbar为NULL时报错
问题描述
在ui中设置controlbar = uiOutput("cont_bar"),并在server中返回NULL时,出现报错:
Error in tagAssert(controlbar[[2]], type = "aside", class = "control-sidebar") :
Expected an object with class 'shiny.tag'.
原因分析
bs4Dash的dashboardPage对controlbar参数有类型校验,要求其必须是shiny.tag类型对象。直接返回NULL不符合该要求,触发了内部的tagAssert检查失败。
解决方案
不要返回NULL,而是返回一个符合要求的空控制栏结构,推荐两种实现方式:
方式1:返回禁用的空控制栏
output$cont_bar = renderUI({ dashboardControlbar(disable = TRUE) })
方式2:返回隐藏的空侧边栏标签
output$cont_bar = renderUI({ tags$aside( class = "control-sidebar control-sidebar-dark", style = "display: none;" ) })
两种方式都能满足类型校验,同时达到隐藏控制栏的效果。
内容的提问来源于stack exchange,提问作者H. berg

