Как покрасить ячейки в Datatable на основе значений нескольких ячеек? - PullRequest
1 голос
/ 10 апреля 2020

У меня есть кадр данных, подобный приведенному ниже, с одним столбцом для большой «Группы» и другим, указывающим на «Команду», в которой кто-то находится в этой группе, и дополнительными столбцами, указывающими их расходы в разные периоды времени.

data <- data.frame("Team" = c("Alex", "Beth", "Andrew", "Bert"),
       "Group" = c("A","B","A","B"),
       "Spending_Q1" = c(1000, 500, 1500, 1000),
       "Spending_Q2" = c(500, 2000, 1000, 500))

Используя пакет DT, я хотел бы раскрасить столбцы Spending_Q1 и Spending_Q2 на основе их соответствующих значений (с градиентом: более темные цвета для более высоких значений), но с разным цветом для каждой команды. Я был в состоянии сделать большую часть этого с тем же градиентом цвета (например, оттенки синего), примененного ко всем значениям, но я не уверен, возможно ли ограничить затенение определенными c строками и столбцы. Кто-нибудь может посоветовать?

Я обращался к руководству RStudio по стилю таблицы данных , но в нем нет примеров для указания затенения для указанных c строк и столбцов.

Спасибо!

1 Ответ

0 голосов
/ 11 апреля 2020

Вот способ. Рендеринг не работает в RStudio, но он работает в браузере.

library(DT)

dat <- data.frame(
  "Team" = c("Alex", "Beth", "Andrew", "Bert"),
  "Group" = c("A","B","A","B"),
  "Spending_Q1" = c(1000, 500, 1500, 1000),
  "Spending_Q2" = c(500, 2000, 1000, 500),
  "Spending_Q3" = c(500, 1000, 1500, 1500)
)
columns <- c(3, 4, 5) # columns we want to colorize
nrows <- nrow(dat)

rowCallback <- c(
  "function(row, data, index){",
  sprintf("  var columns = [%s];", toString(columns)),
  "  var min = data[columns[0]];", 
  "  var max = data[columns[0]];",
  "  for(let i = 1; i < columns.length; i++){",
  "    min = Math.min(min, data[columns[i]]);",
  "    max = Math.max(max, data[columns[i]]);",
  "  }",
  sprintf("  var nrows = %d;", nrows),
  "  var h = index * 360/nrows;",
  "  for(let i = 0; i < columns.length; i++){",
  "    var j = columns[i];",
  "    var l = 75 - 50*(data[j]-min)/(max-min);",
  "    var color = 'hsl(' + h + ', 100%, ' + l + '%)';",
  "    $('td:eq(' + j + ')', row).css('background-color', color);",
  "  }",
  "}"
)

datatable(
  dat, 
  options = list(
    rowCallback = JS(rowCallback),
    columnDefs = list(
      list(className = "dt-center", targets = "_all")
    )
  )        
)

enter image description here

...