You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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')
      )
    )
})

关键细节说明

  1. case_when的作用:用清晰的分支逻辑分别处理主客场场景,精准判断选中俱乐部的比赛结果,避免了原代码中固定值匹配的局限性。
  2. 隐藏Result列:如果不想让用户看到这个用于判断样式的辅助列,就保留columnDefs里的配置,它会把Result列设为不可见。
  3. 样式映射:通过styleEqual把Win/Draw/Loss直接对应到你想要的背景色,逻辑直观且易于维护。

内容的提问来源于stack exchange,提问作者Statto

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:45:51