You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 23:06:07