R:如果值包含某个字符串,则为颜色数据表单元格

时间:2019-06-11 00:08:25

标签: r dplyr dt

我正在尝试创建一个幻想足球委员会,以跟踪每个NFL球员在即将到来的2019赛季的平均吃水状况(ADP)。我正在通过https://fantasyfootballcalculator.com/调用API。我想在一个Shiny应用程序中构建一些外观类似于其站点上的草稿板的东西,但是我可以自定义它:

enter image description here

它不必看起来像这样漂亮,但我希望按位置对单元格进行颜色编码。如您所见,背景颜色显示每个玩家的位置:蓝色代表RB,绿色代表WR,红色代​​表QB,等等。

我意识到在R中使用DT,如果它们是数字值,则可以对单元格进行着色,但是,如果它们包含某些字符串值(如“-RB”或“-WR”),则可以对单元格进行着色 >?我目前在DT表中内置了以下代码,该代码以以下格式显示播放器和位置:“玩家名称-位置”。

library(RJSONIO)
library(RCurl)
library(dplyr)
library(DT)

half_ppr_players = RJSONIO::fromJSON(getURL("https://fantasyfootballcalculator.com/api/v1/adp/half-ppr?teams=12&year=2019"))

half_ppr_df = do.call(rbind.data.frame, half_ppr_players$players)

rownames(half_ppr_df) <- seq(length=nrow(half_ppr_df))

keepers = c()

half_ppr_df = half_ppr_df %>%
  filter(!(name %in% keepers)) 

half_ppr_df = half_ppr_df %>%
  mutate(name = as.character(name),
         adp_rank = 1:nrow(half_ppr_df),
         rd = floor(adp_rank/12),
         pick = ifelse(adp_rank %% 12 == 0, 12, adp_rank %% 12),
         rd = ifelse(pick == 12, rd, rd + 1))

m = matrix(nrow = 17, ncol = 12)
for (row in 1:17) {
  for (col in 1:12) {
    this_row = half_ppr_df[half_ppr_df$rd == row & half_ppr_df$pick == col,]
    if(row %% 2 == 0) {
      m[row, 12-col+1] = paste(this_row$name, '-', this_row$position)
    } else {
      m[row, col] = paste(this_row$name, '-', this_row$position)
    }
  }
}

draftboard = as.data.frame(m)
colnames(draftboard) = paste("Pick", seq(1, ncol(m), 1))
rownames(draftboard) = paste("Rd", seq(1, nrow(m), 1))
DT::datatable(draftboard)

我目前正在使用DT,因为那是我在Shiny应用程序中经常使用的DT,但是我可以接受其他选择。我也了解到,我可能必须构建一个自定义Javascript函数。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

dat <- data.frame(
  V1 = c("John - RB", "Max - WR"),
  V2 = c("Bill - WR", "David - RB")
)

js <- "(/- WR/).test(value) ? 'red' : (/- RB/).test(value) ? 'yellow' : ''"

datatable(dat) %>% 
  formatStyle(1:ncol(dat), backgroundColor = JS(js))

enter image description here