DT datatable设置rownames=F时自定义formatStyle样式不生效如何解决
问题原因
- 当
rownames = T时,DT会自动在表格左侧插入一列行号,索引为0,你原代码中valueColumns = 0就是读取该列的行号值,匹配到最后一行行号6时触发白色背景样式。 - 当
rownames = F时,行号列被移除,不存在索引为0的列,原有样式匹配逻辑找不到取值来源,自然失效。
解决方案
这里提供两种实现方式,你可以根据需求选择:
方案1:使用rowCallback直接判断行索引(推荐,无需修改原有数据和容器)
直接通过DT的rowCallback配置项用JS判断行索引,匹配最后一行时覆盖背景色,无需修改原有数据结构和自定义容器:
library(DT) library(dplyr) library(htmltools) set.seed(1) dat <- matrix(sample(c(0:9999), size = 54, replace = TRUE), nrow = 6) %>% as.data.frame() sketch = htmltools::withTags(table( class = 'display', thead( tr( th(rowspan = 1, 'Customer'), th(colspan = 1, 'Transaction'), th(colspan = 11, 'Numbers') ), tr( lapply(colnames(dat), th) ) ) )) datatable(dat, container = sketch, rownames = F, options = list( pageLength = 10, dom = 't', # 新增rowCallback配置,直接判断最后一行修改样式 rowCallback = JS( "function(row, data, displayNum, displayIndex, dataIndex) {", # 动态适配行数,无需手动写死索引值 paste0(" if(dataIndex == ", nrow(dat)-1, ") {"), " $(row).find('td').css('background-color', 'white');", " }", "}" ) )) %>% # 数值区间着色逻辑保持不变,rownames=F时列名匹配依然生效 formatStyle(names(dat), background = styleInterval(c(0,5,10,50,100,500,1000,5000), c("#ffffff", "#f2fbd2", "#c9ecb4", "#93d3ab", "#35b0ab" ,"#E5B9ADFF","#E5B9ADFF","#D98994FF","#D0587EFF")))
方案2:新增隐藏行号列(适配原有formatStyle写法逻辑)
如果不想修改JS代码,保留原有用styleEqual匹配行号的逻辑,可以新增行号隐藏列实现:
library(DT) library(dplyr) library(htmltools) set.seed(1) dat <- matrix(sample(c(0:9999), size = 54, replace = TRUE), nrow = 6) %>% as.data.frame() # 新增行号列,用于后续样式匹配 dat$row_id = 1:nrow(dat) # 自定义容器新增对应行号列的表头(后续会隐藏该列,表头仅做占位用) sketch = htmltools::withTags(table( class = 'display', thead( tr( th(style = "display:none;"), # 对应隐藏的行号列 th(rowspan = 1, 'Customer'), th(colspan = 1, 'Transaction'), th(colspan = 11, 'Numbers') ), tr( th(style = "display:none;"), # 对应隐藏的行号列 lapply(colnames(dat)[-ncol(dat)], th) # 排除行号列,取原有数据列的列名 ) ) )) datatable(dat, container = sketch, rownames = F, options = list( pageLength = 10, dom = 't', # 配置行号列为隐藏列 columnDefs = list(list(visible = FALSE, targets = ncol(dat)-1)) )) %>% # 数值区间着色,列范围为排除行号列的所有数据列 formatStyle(0:(ncol(dat)-2), background = styleInterval(c(0,5,10,50,100,500,1000,5000), c("#ffffff", "#f2fbd2", "#c9ecb4", "#93d3ab", "#35b0ab" ,"#E5B9ADFF","#E5B9ADFF","#D98994FF","#D0587EFF"))) %>% # 最后一行着色,valueColumns取隐藏的行号列 formatStyle(columns = 0:(ncol(dat)-2), valueColumns = ncol(dat)-1, target = 'cell', backgroundColor = styleEqual(nrow(dat), 'white'))
内容的提问来源于stack exchange,提问作者Santhosh N
相关产品推荐
相关产品推荐

