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

如何在R Shiny中实现数据集关联的网格与标签页结构?

R Shiny数据集切换标签页与侧边栏隐藏实现方案

需求概述

  • 左侧侧边栏选择不同数据集时,中央面板动态展示对应标签页集合(tabsetPanel)
  • 侧边栏支持一键隐藏/展开,优化界面空间利用

修改后完整代码

library(shiny)
library(plotly)
library(gridlayout)
library(bslib)

ui <- grid_page(
  layout = c(
    "header  header",
    "sidebar main"
  ),
  row_sizes = c(
    "40px",
    "1fr"
  ),
  col_sizes = c(
    "165px",
    "1fr"
  ),
  gap_size = "1rem",
  # 可折叠侧边栏
  grid_card(
    area = "sidebar",
    sidebar(
      title = "DATASET Simulator",
      collapsible = TRUE,
      width = "165px",
      selectInput(
        inputId = "dataset",
        label = "DATASET",
        choices = list(
          "Dataset 1" = "Dataset1",
          "Dataset 2" = "Dataset2",
          "Dataset 3" = "Dataset3"
        ),
        selected = "Dataset1",
        width = "100%"
      ),
      em("Select the type of dataset you want to simulate.")
    )
  ),
  grid_card_text(
    area = "header",
    content = "Dataset Simulation Project",
    alignment = "start",
    is_title = FALSE
  ),
  # 动态渲染中央面板
  grid_card(
    area = "main",
    full_screen = TRUE,
    uiOutput("dataset_tabset")
  )
)

server <- function(input, output) { 
  # 根据选中数据集动态生成标签页
  output$dataset_tabset <- renderUI({
    switch(input$dataset,
           "Dataset1" = tagList(
             card_header("Dataset 1"),
             card_body(
               tabsetPanel(
                 nav_panel(title = "Parameters", p("Dataset1 参数配置")),
                 nav_panel(title = "Results 1", plotlyOutput("plot1")),
                 nav_panel(title = "Results 2", tableOutput("table1"))
               )
             )
           ),
           "Dataset2" = tagList(
             card_header("Dataset 2"),
             card_body(
               tabsetPanel(
                 nav_panel(title = "Advanced Params", p("Dataset2 高级参数")),
                 nav_panel(title = "Visualization", plotlyOutput("plot2")),
                 nav_panel(title = "Summary", verbatimTextOutput("summary2"))
               )
             )
           ),
           "Dataset3" = tagList(
             card_header("Dataset 3"),
             card_body(
               tabsetPanel(
                 nav_panel(title = "Basic Settings", p("Dataset3 基础设置")),
                 nav_panel(title = "Correlation Matrix", plotlyOutput("corr_plot")),
                 nav_panel(title = "Statistics", verbatimTextOutput("stats3"))
               )
             )
           )
    )
  })
  
  # 示例输出(可根据实际需求替换)
  output$plot1 <- renderPlotly({
    plot_ly(x = rnorm(100), y = rnorm(100), type = "scatter", mode = "markers")
  })
  
  output$table1 <- renderTable({
    data.frame(X = rnorm(10), Y = rnorm(10))
  })
  
  output$plot2 <- renderPlotly({
    plot_ly(x = 1:10, y = runif(10), type = "bar")
  })
  
  output$summary2 <- renderPrint({
    summary(rnorm(50))
  })
  
  output$corr_plot <- renderPlotly({
    plot_ly(z = cor(matrix(rnorm(100), ncol=5)), type = "heatmap")
  })
  
  output$stats3 <- renderPrint({
    t.test(rnorm(30), rnorm(30))
  })
}

shinyApp(ui, server)

核心实现要点

  1. 可折叠侧边栏:使用bslib::sidebar()替代原静态卡片,通过collapsible = TRUE开启折叠功能,点击侧边栏标题即可切换隐藏/展开状态。
  2. 动态标签页渲染:中央面板通过uiOutput配合renderUI,利用switch()函数根据input$dataset的选中值,返回对应数据集的标签页集合,实现内容动态切换。
  3. 网格布局适配:保留原gridlayout结构,侧边栏折叠时系统会自动调整中央面板的宽度,无需额外配置布局规则。
  4. 自定义内容扩展:每个数据集的标签页内容可独立定义,示例中添加了不同类型的输出组件(图表、表格、统计结果),可根据实际业务需求替换。

内容的提问来源于stack exchange,提问作者Arnau G.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 11:17:34