R Shiny中封装的tabItem无法在shinydashboard中渲染如何解决
渲染异常的原因
shinydashboard的tabItems()函数对入参结构有严格要求:它需要直接接收多个tabItem作为独立参数,内部会为这些直接子级tabItem添加tab-pane交互属性,和侧边栏menuItem的tabName做绑定。
你用div()包裹多个tabItem后,tabItems()拿到的唯一参数是一个div容器,而非直接的tabItem对象,无法完成属性绑定和切换逻辑,因此内容不能正常渲染。
正确的封装实现方法
不要用div包裹tabItem,将需要封装的多个tabItem存为列表结构,传入tabItems()时将列表元素展开为独立参数即可,有两种常用实现方式:
方法1:用!!!操作符展开列表
需要用到rlang包的非标准评估操作符,代码示例:
library(shiny) library(shinydashboard) library(DT) library(rlang) # 封装tabItem为列表,不要用div包裹 c_b <- list( tabItem(tabName = "menu1", dataTableOutput("tab")), tabItem(tabName = "menu2", dataTableOutput("tab1")) ) ui <- dashboardPage( dashboardHeader(), dashboardSidebar( sidebarMenu( menuItem("menu1", tabName = "menu1", icon = icon("table")), menuItem("menu2", tabName = "menu2", icon = icon("table")) ) ), dashboardBody( # 用!!!将列表展开为tabItems的独立参数 tabItems(!!!c_b) ) ) server <- function(input, output, session) { output$tab <- renderDataTable({ datatable(iris) }) output$tab1 <- renderDataTable({ datatable(iris) }) } shinyApp(ui = ui, server = server)
方法2:用do.call构造函数调用
不需要额外依赖包,直接用R原生的do.call构造tabItems调用:
# 其他代码和上面完全一致,仅修改dashboardBody部分 dashboardBody( do.call(tabItems, c_b) )
两种方法都可以实现tabItem的封装复用,运行效果和直接声明的写法完全一致。
内容的提问来源于stack exchange,提问作者manu p
相关产品推荐
相关产品推荐

