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

如何在Shiny中使用gt包创建可响应式表格(替代DT包)

解决方案:在Shiny中结合gt包实现响应式表格(保留样式)

以下是完整的实现代码,既保留了你原有的gt表格美观特性,又添加了针对manufacturer、trans、class和displ的响应式筛选交互:

library(shiny)
library(tidyverse)
library(gt)
library(gtExtras)

ui <- fluidPage(
    titlePanel("Cars data set"),
    sidebarLayout(
        sidebarPanel(
            width = 3,
            # 制造商筛选(支持多选)
            selectInput(
                inputId = "manufacturer",
                label = "选择品牌",
                choices = unique(mpg$manufacturer),
                selected = unique(mpg$manufacturer),
                multiple = TRUE
            ),
            # 变速箱类型筛选(支持多选)
            selectInput(
                inputId = "trans",
                label = "选择变速箱类型",
                choices = unique(mpg$trans),
                selected = unique(mpg$trans),
                multiple = TRUE
            ),
            # 车型分类筛选(支持多选)
            selectInput(
                inputId = "class",
                label = "选择车型",
                choices = unique(mpg$class),
                selected = unique(mpg$class),
                multiple = TRUE
            ),
            # 发动机排量范围筛选
            sliderInput(
                inputId = "displ_range",
                label = "发动机排量范围",
                min = min(mpg$displ),
                max = max(mpg$displ),
                value = c(min(mpg$displ), max(mpg$displ)),
                step = 0.1
            )
        ),
        mainPanel(
            width = 9,
            gt_output(outputId = "Table")
        )
    )
)

server <- function(input, output) {
    # 创建响应式过滤数据集
    filtered_data <- reactive({
        mpg |>
            filter(
                manufacturer %in% input$manufacturer,
                trans %in% input$trans,
                class %in% input$class,
                displ >= input$displ_range[1],
                displ <= input$displ_range[2]
            ) |>
            group_by(manufacturer)
    })
    
    # 动态生成带样式的gt表格
    output$Table <- render_gt({
        filtered_data() |>
            gt() |>
            gt_theme_nytimes() |>
            gt_highlight_rows(
                rows = class == "suv",
                fill = "#D3B1E0",
                bold_target_only = TRUE,
                target_col = class
            ) |>
            fmt_number(
                columns = displ,
                decimals = 2,
                use_seps = FALSE
            ) |>
            gt_plt_bar(column = displ, keep_column = FALSE, width = 45,
                       color = "#800080",
                       scale_type = "number") |>
            tab_header(
                title = "Cars data set"
            ) |>
            cols_label(
                manufacturer = "Brand",
                trans = "Type of transmission",
                class = "Type of car",
                displ = "Engine Displacement"
            )
    })
}

# Run the application
shinyApp(ui = ui, server = server)

关键实现说明:

  • 响应式数据驱动:通过reactive()创建filtered_data对象,它会自动监听输入控件的变化,实时输出符合筛选条件的数据集。
  • 动态表格渲染:将原有的gt样式代码移入render_gt()函数内,确保每次数据更新时,都会重新生成带有完整样式的表格,完全保留你需要的美观特性。
  • 匹配控件类型:针对分类字段使用支持多选的selectInput,针对数值型排量字段使用sliderInput实现范围筛选,贴合数据类型优化交互体验。
  • 样式完全保留:原有的主题、行高亮、数值格式化、条形图等gt自定义设置全部保留,未做任何删减。

内容的提问来源于stack exchange,提问作者Stats Iliterate

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 07:12:06