使用R语言DT包复刻Excel条件格式(足球赛事场景)
解决DT包适配主客场的行高亮问题
我懂你要实现的效果——根据选中俱乐部的主客场比赛结果动态高亮表格行,原代码的问题在于它只盯着Home.Goals的固定数值设置颜色,完全没考虑俱乐部是主场还是客场的差异,也没有动态比较进球数。下面是调整后的完整代码,我会把逻辑拆解清楚:
核心思路
先给筛选后的比赛数据新增一个Result列,标记选中俱乐部在这场比赛中的胜/平/负结果,再根据这个列的值给整行设置对应背景色。这样就能完美适配主客场的不同场景。
完整代码
# 确保先加载所需包 library(shiny) library(DT) library(dplyr) output$match_cr <- DT::renderDataTable({ match_cr <- match # 筛选选中俱乐部的主客场赛事 match_cr <- subset(match_cr, Home.Club == input$club | Away.Club == input$club ) # 筛选赛季(如果不是全选) if (input$season != "All") { match_cr <- subset(match_cr, Season == input$season ) } # 新增Result列,标记选中俱乐部的比赛结果 match_cr$Result <- case_when( # 选中俱乐部是主场的情况:比较主场进球 vs 客场进球 match_cr$Home.Club == input$club & match_cr$Home.Goals > match_cr$Away.Goals ~ "Win", match_cr$Home.Club == input$club & match_cr$Home.Goals == match_cr$Away.Goals ~ "Draw", match_cr$Home.Club == input$club & match_cr$Home.Goals < match_cr$Away.Goals ~ "Loss", # 选中俱乐部是客场的情况:比较客场进球 vs 主场进球 match_cr$Away.Club == input$club & match_cr$Away.Goals > match_cr$Home.Goals ~ "Win", match_cr$Away.Club == input$club & match_cr$Away.Goals == match_cr$Home.Goals ~ "Draw", match_cr$Away.Club == input$club & match_cr$Away.Goals < match_cr$Home.Goals ~ "Loss" ) # 生成DT表格并设置行样式 DT::datatable( match_cr, filter = 'top', options = list( lengthMenu = list(c(-1, 10, 50, 100), list('All', 10, 50, 100)), pageLength = -1, # 可选:隐藏Result列(只用来判断样式,不显示给用户) columnDefs = list(list(visible = FALSE, targets = which(colnames(match_cr) == "Result"))) ), selection = 'none' ) %>% formatStyle( columns = colnames(match_cr), # 对所有列生效(即整行高亮) valueColumns = 'Result', # 根据Result列的值匹配样式 target = 'row', backgroundColor = styleEqual( c("Win", "Draw", "Loss"), c('green', 'grey', 'red') ) ) })
关键细节说明
case_when的作用:用清晰的分支逻辑分别处理主客场场景,精准判断选中俱乐部的比赛结果,避免了原代码中固定值匹配的局限性。- 隐藏
Result列:如果不想让用户看到这个用于判断样式的辅助列,就保留columnDefs里的配置,它会把Result列设为不可见。 - 样式映射:通过
styleEqual把Win/Draw/Loss直接对应到你想要的背景色,逻辑直观且易于维护。
内容的提问来源于stack exchange,提问作者Statto
相关产品推荐
相关产品推荐

