R Shiny中编辑DT关联列值时对应颜色列样式不显示问题
R Shiny DT 表格条件色不更新修复方案
问题原因
- 初始表格通过静态的
isolate(d9)生成,formatStyle规则仅在首次渲染时生效,后续replaceData仅更新数据不会触发样式重新计算 - 嵌套
ifelse没有兜底分支,当三个判定条件都不满足时会返回NA值,导致样式匹配失效 - 包含特殊字符的列名
R/Y/G存在解析异常风险
修复步骤
- 移除静态生成的
dt_d9对象,将表格生成和样式绑定逻辑放到renderDT内部,响应rv$d9的变化 - 补全
ifelse的兜底分支,避免NA值生成 - 优化reactive赋值逻辑,移除冗余的代理更新代码
修复后完整代码
cmp_data1 <- dbGetQuery(qr,sql) saveRDS(cmp_data1, 'q1.rds') dt_output = function(title, id) { fluidRow(column( 12, h1(paste0(title)), hr(), DTOutput(id) )) } render_dt = function(data, editable = 'cell', server = TRUE, ...) { renderDT(data,selection = 'none', server = server, editable = editable, ...) } ui = fluidPage( downloadButton("mcp_csv", "Download as CSV", class="but"), dt_output('Report', 'x9') ) server = function(input, output, session) { if(!file.exists("cm.rds")){ d9 = cmp_data1 d9[['R/Y/G']] <- NA d9[['R']] <- NA d9[['Y']] <- NA d9[['G']] <- NA d9[['tcolor']] <- NA } else{ cmp <- readRDS("cm.rds") d9 = cbind(cmp_data1, cmp[,(ncol(cmp)-4):ncol(cmp)]) } rv <- reactiveValues(d9 = d9) # 将表格生成和样式绑定放到响应式上下文中,数据更新时自动重新渲染样式 output$x9 = renderDT({ datatable(rv$d9, editable = 'cell', rownames = FALSE, extensions = 'Buttons', options = list(dom = 'Bfrtip', buttons = I('colvis'))) %>% formatStyle( 'R/Y/G', 'tcolor', backgroundColor = styleEqual(c(0,1,2), c('green', 'yellow', 'red')),fontWeight = 'bold' ) }, selection = 'none', server = TRUE) observeEvent(input$x9_cell_edit, { rv$d9 <- editData(rv$d9, input$x9_cell_edit, 'x9', rownames = FALSE) # 补全ifelse兜底分支,不满足条件时默认返回NA无背景色 rv$d9$tcolor <- ifelse(rv$d9$R > 2500000, 2, ifelse(rv$d9$Y >= 2000000 & rv$d9$Y <= 2500000, 1, ifelse(rv$d9$G <= 2000000, 0, NA))) saveRDS(rv$d9, 'cm.rds') }) }
内容的提问来源于stack exchange,提问作者retrx22
相关产品推荐
相关产品推荐

