如何在不缩小字体的情况下压缩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
相关产品推荐
相关产品推荐

