Shiny应用tabsetPanel添加多个tabPanel失效问题求助
解决方案完整代码
library(shiny) library(dplyr) library(ggplot2) ui <- fluidPage( # 侧边栏提到外层全局共用,所有标签页共享筛选条件 sidebarLayout(position = "left", sidebarPanel("侧边栏", selectInput(inputId = "table", label = "选择供应商", "Names"), actionButton(inputId = "btn",label="更新") ), mainPanel( tabsetPanel( # 原有表格标签页 tabPanel("表格", tableOutput("myTable") ), # 新增标签页1:破损率柱状图 tabPanel("柱状图", plotOutput("brkPlot") ), # 新增标签页2:aggregate函数处理的聚合结果 tabPanel("聚合汇总", tableOutput("aggTable") ) ) ) ) ) server <- function(input, output,session) { GlassSupplier <- c('Supplier 1','Supplier 2','Supplier 1','Supplier 4','Supplier 2') WindowType <- c('Wood','Vinyl','Aluminum','Aluminum','Vinyl') BreakageRate <- c(7.22,6.33,3.63,2,6) df<- data.frame(GlassSupplier,WindowType,BreakageRate) # 原有dplyr处理的分组数据 data <- eventReactive(input$btn, { req(input$table) df %>% dplyr::filter(GlassSupplier %in% input$table) %>% group_by(WindowType) %>% dplyr::summarise(BrkRate = mean(BreakageRate)) }) # 新增aggregate函数处理的聚合数据 agg_data <- eventReactive(input$btn, { req(input$table) filter_df <- df[df$GlassSupplier == input$table,] aggregate(BreakageRate ~ WindowType, data = filter_df, FUN = mean) }) # 动态更新下拉选项,增加unique去重避免重复选项 observe({ updateSelectInput(session, "table", choices = unique(df$GlassSupplier)) }) output$myTable = renderTable({ data() }) # 新增柱状图渲染逻辑 output$brkPlot = renderPlot({ req(data()) ggplot(data(), aes(x = WindowType, y = BrkRate, fill = WindowType)) + geom_col() + labs(x = "窗户类型", y = "平均破损率", title = "不同窗户类型破损率统计") + theme_minimal() }) # 新增聚合结果渲染逻辑 output$aggTable = renderTable({ agg_data() }) } shinyApp(ui,server)
核心修改说明
- 原有代码将
sidebarLayout放在了第一个tabPanel内部,新增标签页时如果没有放在tabsetPanel的同级参数列表中就会无法渲染,本次调整将公共侧边栏提到外层,所有标签页统一放在主面板的tabsetPanel内,保证所有页面都能共用筛选条件。 - 新增了2个功能标签页,分别满足图表绘制、
aggregate函数做数据聚合的需求。 - 下拉选项增加去重处理,避免同一个供应商重复出现的问题。
内容的提问来源于stack exchange,提问作者Bradley Brewer
相关产品推荐
相关产品推荐

