如何在R/Shiny中让DT数据表列宽自适应单元格内容
R/Shiny 环境下DT表自动适配列宽方案
现有硬编码列宽方案
目前已知可通过配置options参数手动指定DT数据表列宽,参考代码如下:
DT::datatable(mtcars, options = list( autoWidth = TRUE, columnDefs = list(list(width = '70px', targets = which(colnames(mtcars) %in% c("gear"))), list(width = '100px', targets = which(colnames(mtcars) %in% c("disp", "hp"))) ) ) )
该方案需要手动写入固定宽度值,无法根据单元格实际内容自动适配宽度。
基于DataTables原生columns.adjust()的自适应实现
DataTables原生提供的columns.adjust()方法可自动计算单元格内容宽度,重新调整列宽适配内容,在R/Shiny环境中无需硬编码宽度值,只需在表格初始化回调中触发该方法即可,修改后的可运行示例如下:
library(shiny) library(DT) ui <- fluidPage( DT::dataTableOutput(outputId = "table") ) server <- function(input, output) { output$table <- DT::renderDataTable({ DT::datatable(mtcars, options = list( autoWidth = TRUE, # 移除硬编码的固定宽度配置,初始化完成后触发自适应 initComplete = JS( "function(settings) {", " settings.oInstance.api().columns.adjust();", "}" ) ) ) }) } shinyApp(ui, server)
补充说明
- 若需要保留部分列固定宽度、其余列自适应,只需在
columnDefs中给需要固定宽度的列单独配置width参数即可,未配置宽度的列会被自动计算适配 - 若表格存在动态更新数据、切换标签页显示/隐藏等场景,可在触发对应操作的逻辑中,通过表格代理调用
columns.adjust()方法重新计算宽度,动态更新场景下可通过如下代码触发重算:
# 获取表格代理 proxy <- dataTableProxy("table") # 数据更新操作完成后触发列宽重算 proxy %>% selectColumns(NULL)
内容的提问来源于stack exchange,提问作者vladli
相关产品推荐
相关产品推荐

