Можно ли стилизовать заголовок RowGroup? Например, как изменить цвет шрифта здесь:

library(DT)

mtcars2 = mtcars[1:20, ]
datatable(
  mtcars2[order(mtcars2$cyl), ],
  extensions = 'RowGroup',
  options = list(rowGroup = list(dataSrc = 2)),
  selection = 'none'
)

Я нашел этот соответствующий вопрос, но я могу Не применяю ответ к моему случаю.

В случае многоуровневой группировки, как стилизовать только заголовок определенной группы?

r dt
2
George Dontas 18 Июл 2020 в 13:54

1 ответ

Лучший ответ
mtcars2 = mtcars[1:20, ]
datatable(
  mtcars2[order(mtcars2$cyl), ],
  extensions = 'RowGroup',
  options = list(
    rowGroup = list(
      dataSrc = 2,
      startRender = JS(
        "function(rows, group) {", 
        "  var style = group == 4 ? 'background-color: lime;' : 'background-color: crimson;';",
        "  var td = `<td style='${style}' colspan=12>${group}</td>`;",
        "  return $(`<tr>${td}</tr>`);",
        "}"
      )
    )
  ),
  selection = 'none'
)

Бонус

Вот способ автоматического стилизации заголовков группы строк. Он использует библиотеку JavaScript d3-scale-chromatic для цветовой палитры и TinyColor для определения темного или светлого цвета.

dat <- data.frame(
  Group = gl(10, 2, labels = LETTERS[1:10]),
  x1 = rpois(20, 100),
  x2 = rpois(20, 100),
  x3 = rpois(20, 100)
)

dtable <- datatable(
  dat,
  class = "compact",
  extensions = 'RowGroup',
  options = list(
    pageLength = 20,
    rowGroup = list(
      dataSrc = 1,
      startRender = JS(
        "function(rows, group) {", 
        "  var groups = this.s.dt.table().column(1).data().unique();",
        "  var t = groups.indexOf(group) / groups.length;",
        "  var bgcolor = d3.interpolateWarm(t);",
        "  var color = tinycolor(bgcolor).isDark() ? 'white' : 'black'",
        "  var style = `color: ${color}; background-color: ${bgcolor};`;",
        "  var ncol = this.s.dt.table().columns().count();",
        "  var td = `<td style='${style}' colspan=${ncol}>${group}</td>`;",
        "  return $(`<tr>${td}</tr>`);",
        "}"
      )
    )
  ),
  selection = 'none'
)

dep <- htmltools::htmlDependency(
  "d3-scale-chromatic", "1.5.0",
  c(href =  "https://d3js.org/"), 
  script = c(
    "d3-color.v1.min.js", 
    "d3-interpolate.v1.min.js",
    "d3-scale-chromatic.v1.min.js"
  )
)
dtable$dependencies <- c(dtable$dependencies, list(dep))
dep <- htmltools::htmlDependency(
  "TinyColor", "1.4.1",
  c(href =  "https://cdn.jsdelivr.net/gh/bgrins/TinyColor/"), 
  script = "tinycolor.js"
)
dtable$dependencies <- c(dtable$dependencies, list(dep))

dtable

enter image description here


РЕДАКТИРОВАТЬ

Если у вас есть вложенные группы, вот как применить стиль только ко второму уровню:

mtcars2 = mtcars[1:20, ]
datatable(
  mtcars2[order(mtcars2$cyl), ],
  extensions = 'RowGroup',
  options = list(
    rowGroup = list(
      dataSrc = c(2,11),
      startRender = JS(
        "function(rows, group, level) {", 
        "  if(level == 1) {",
        "    var style = 'background-color: lime;'",
        "    var td = `<td style='${style}' colspan=12>${group}</td>`;",
        "    return $(`<tr>${td}</tr>`);",
        "  }else{",
        "    return group;",
        "  }",
        "}"
      )
    )
  ),
  selection = 'none'
)
1
Stéphane Laurent 18 Июл 2020 в 14:07