基于Target列百分比规则条件格式化DT的Roll_3_Weeks列
解决方案
要实现基于每行Target列动态阈值的Roll_3_Weeks列条件格式化,不能用styleInterval(它仅支持全局固定阈值),需要借助JS自定义函数在formatStyle中实现行级的动态判断。
修改后的完整代码
output$backs_week_table <- renderDT({ datatable(Backs_td_week, extensions = 'FixedColumns', options = list( pageLength = 15, fixedColumns = list(leftColumns = 3), dom = 't', # 仅显示表格,隐藏搜索和分页 columnDefs = list( list(targets = c(0, 1), className = 'dt-left'), # 前两列左对齐 list(targets = seq(1, ncol(Backs_td_week) - 1), className = 'dt-center') # 第三列及以后居中对齐 ), rowCallback = JS('function(row, data, index) { $("td", row).css("padding-top", "5px"); $("td", row).css("padding-bottom", "5px"); }') ), rownames = FALSE ) %>% formatStyle( names(Backs_td_week), border = '1px solid #ddd' # 添加单元格边框 ) %>% formatStyle( names(Backs_td_week)[grepl("Perc_", names(Backs_td_week))], valueColumns = names(Backs_td_week)[grepl("Perc_", names(Backs_td_week))], color = 'black', background = styleColorBar( sapply(Backs_td_week[, grepl("Perc_", names(Backs_td_week))], function(x) scales::rescale(x, to = c(0, 100))), 'indianred') ) %>% # 新增:Roll_3_Weeks列的条件格式化 formatStyle( columns = "Roll_3_Weeks", # 要格式化的目标列 valueColumns = c("Roll_3_Weeks", "Target"), # 需要用到的两列数据 backgroundColor = JS( "function(value, row) {", " const threshold = row.Target * 3 * 0.95;", # 计算每行的动态阈值 " return value >= threshold ? '#90EE90' : '#FF6347';", # 满足条件设绿色,否则红色 "}" ), color = "black" # 文本颜色设为黑色,保证可读性 ) })
关键说明
- 动态阈值计算:通过
row.Target获取当前行的Target值,计算出Target*3*0.95的阈值,实现每行不同的判断标准。 - 颜色选择:示例中用
#90EE90(浅绿色)和#FF6347(浅红色),你可以根据需求替换为其他颜色代码或颜色名称。 - 列名匹配:确保
columns和valueColumns中的列名与你的数据框Backs_td_week中的实际列名完全一致,否则会失效。
内容的提问来源于stack exchange,提问作者Jake
相关产品推荐
相关产品推荐

