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

如何在不缩小字体的情况下压缩Shiny中的DT数据表

解决Shiny中DT表格横向滚动问题的紧凑化方案

要解决DT表格出现横向滚动条的问题,让表格更紧凑且无需缩小字体,可以试试以下几种方法:

1. 减小单元格内边距(最直接有效)

DT表格默认的单元格内边距较大,这是列间距宽的主要原因。你可以通过自定义CSS直接修改td(单元格)和th(表头)的内边距值:

tags$style(HTML("
  .dataTable td, .dataTable th {
    padding: 2px 4px !important; /* 上下2px、左右4px,可按需调整数值 */
  }
"))

同时记得把renderDataTable中的scrollX=TRUE去掉,让表格自动适应容器宽度。

2. 启用DT内置的紧凑样式类

DT提供了compact样式类,启用后会自动调整内边距和行高,让表格整体更紧凑:

output$active_cases = DT::renderDataTable(
  mtcars, 
  selection = 'single', 
  class='compact', # 开启紧凑样式
  options=list(scrollX=FALSE) # 关闭横向滚动
)

3. 手动指定列宽(针对特定列优化)

如果某些列内容较少,可以通过columnDefs强制设置列宽,避免不必要的留白:

output$active_cases = DT::renderDataTable(
  mtcars, 
  selection = 'single', 
  options=list(
    scrollX=FALSE,
    columnDefs = list(
      list(width = '60px', targets = c(0,1,2)), # 给前3列设置固定宽度
      list(width = '70px', targets = 3:10)      # 给剩余列设置统一宽度
    )
  )
)

组合方法的完整示例代码

把上述方法结合起来,修改你的最小可复现示例:

library(shiny)
library(data.table)
library(DT)
library(bslib)

server = shinyServer(function(input,output){
  
  output$histogram = renderPlot(
    hist(faithful$eruptions, breaks=input$days_plot)
  )
  
  output$active_cases = DT::renderDataTable(
    mtcars, 
    selection = 'single', 
    class='compact', # 启用内置紧凑样式
    options=list(
      scrollX=FALSE, # 关闭横向滚动
      columnDefs = list(
        list(width = '60px', targets = c(0,1,2)),
        list(width = '70px', targets = 3:10)
      )
    )
  )
  
})

ui = shinyUI(
  dashboardPage(
    dashboardHeader(
      title="iris test"
    ),
    dashboardSidebar(
      sidebarMenu(id="tabs",
                  menuItem("Iris - Active Cases", tabName="active_cases", icon = icon("magnifying-glass-location")),
                  menuItem("Iris - Archive", tabName="archive", icon = icon("box-archive")),
                  menuItem("Configuration", sliderInput("days_plot", "Days into past", 1, 60, 30))
      )
    ),
    dashboardBody(
      # 自定义CSS进一步缩小内边距
      tags$style(HTML("
        .dataTable td, .dataTable th {
          padding: 2px 4px !important;
        }
      ")),
      tabItems(
        tabItem(tabName="active_cases", shiny::h2("Active Cases"),
                fluidRow(
                  box(title="Cases", status="primary", solidHeader=TRUE, DT::dataTableOutput("active_cases")),
                  box(title="Cases", status="primary", solidHeader=TRUE, plotOutput("histogram"))
                )
        ),
        tabItem(tabName="archive", shiny::h2("Archive"))
      )
    )
  )
)

shinyApp(ui, server)

你可以根据实际数据调整内边距数值和列宽,找到最适合的紧凑程度,这样就能去掉横向滚动条,同时不用缩小字体。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 19:10:51