Одинаковая ширина столбца в формате R

Я использую пакет formattable для создания некоторых отчетов непосредственно из R, и мне нужно, чтобы столбцы, использующие "style" normalize_bar, имели одинаковую ширину, чтобы можно было сравнивать значения между столбцами.

В следующем примере показаны два столбца, которые имеют очень похожие значения (минимальное и максимальное значения равны), но имеют разную ширину, теряя графические детали панели ("Test.number.1.score" и "test2_score").

library(formattable)

df <- data.frame(
  id = 1:10,
  name = c("Bob", "Ashley", "James", "David", "Jenny", 
           "Hans", "Leo", "John", "Emily", "Lee"), 
  age = c(28, 27, 30, 28, 29, 29, 27, 27, 31, 30),
  grade = c("C", "A", "A", "C", "B", "B", "B", "A", "C", "C"),
  Test.number.1.score = c(8.9, 9.5, 9.6, 8.9, 9.1, 9.3, 9.3, 9.9, 8.5, 8.6),
  test2_score = c(9.1, 9.1, 9.2, 9.1, 8.9, 8.5, 9.9, 9.3, 9.1, 8.6),
  final_score = c(9, 9.3, 9.4, 9, 9, 8.9, 9.25, 9.6, 8.8, 8.7),
  registered = c(TRUE, FALSE, TRUE, FALSE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE),
  stringsAsFactors = FALSE)

formattable(df, list(
  age = color_tile("white", "orange"),
  grade = formatter("span", style = x ~ ifelse(x == "A", 
                                               style(color = "green", font.weight = "bold"), NA)),
  area(col = c(Test.number.1.score, test2_score)) ~ normalize_bar("pink", 0.2),
  final_score = formatter("span",
                          style = x ~ style(color = ifelse(rank(-x) <= 3, "green", "gray")),
                          x ~ sprintf("%.2f (rank: %02d)", x, rank(-x))),
  registered = formatter("span",
                         style = x ~ style(color = ifelse(x, "green", "red")),
                         x ~ icontext(ifelse(x, "ok", "remove"), ifelse(x, "Yes", "No")))
))

Заранее спасибо.

1 ответ

Решение

Непосредственное использование форматера решает эту проблему. Вы хотите одинаковую ширину для обоих столбцов.

Когда я посмотрел код функции color_bar, я обнаружил, что это атрибут width для ширины цветной части. В основном я изменяю это свойство, чтобы получить желаемый результат.

сначала установите ширину скажем 150 пикселей

fixedWidth = 150

и измени свой formattable вызов функции для

formattable(df, list(
    age = color_tile("white", "orange"),
    grade = formatter("span", style = x ~ ifelse(x == "A", 
                                                 style(color = "green", font.weight = "bold"), NA)),
    test2_score = formatter(.tag = "span", style = function(x) style(display = "inline-block", 
                                                                     direction = "rtl", `border-radius` = "4px", `padding-right` = "2px", 
                                                                     `background-color` = csscolor("pink"), width = paste(fixedWidth*proportion(x),"px",sep="") )),
    Test.number.1.score = formatter(.tag = "span", style = function(x) style(display = "inline-block", 
                                                                             direction = "rtl", `border-radius` = "4px", `padding-right` = "2px", 
                                                                             `background-color` = csscolor("pink"), width = paste(fixedWidth*proportion(x),"px",sep="") )),


    final_score = formatter("span",
                            style = x ~ style(color = ifelse(rank(-x) <= 3, "green", "gray")),
                            x ~ sprintf("%.2f (rank: %02d)", x, rank(-x))),
    registered = formatter("span",
                           style = x ~ style(color = ifelse(x, "green", "red")),
                           x ~ icontext(ifelse(x, "ok", "remove"), ifelse(x, "Yes", "No")))
))

Обратите внимание width = paste(fixedWidth*proportion(x),"px",sep="") для изменения фиксированной ширины и csscolor("pink") изменить цвет на розовый внутри форматера.

Желаемый результат выглядит как ниже Финальный отчет

ОБНОВИТЬ

Или более чисто вы можете создать свой собственный color_bar функция именно my_color_bar изменив его width аргумент, как показано ниже

my_color_bar <- function (color = "lightgray", fixedWidth=150,...) 
{
        formatter("span", style = function(x) style(display = "inline-block", 
                                                direction = "rtl", `border-radius` = "4px", `padding-right` = "2px", 
                                                `background-color` = csscolor(color), width = paste(fixedWidth*proportion(x),"px",sep=""), 
                                                ...))
}

И использовать его в своем formattable вызов функции как

formattable(df, list(
    age = color_tile("white", "orange"),
    grade = formatter("span", style = x ~ ifelse(x == "A", 
                                                 style(color = "green", font.weight = "bold"), NA)),
    test2_score = my_color_bar(color="pink",width = 100),
    Test.number.1.score = my_color_bar(color="pink",width=100),


    final_score = formatter("span",
                            style = x ~ style(color = ifelse(rank(-x) <= 3, "green", "gray")),
                            x ~ sprintf("%.2f (rank: %02d)", x, rank(-x))),
    registered = formatter("span",
                           style = x ~ style(color = ifelse(x, "green", "red")),
                           x ~ icontext(ifelse(x, "ok", "remove"), ifelse(x, "Yes", "No")))
))
Другие вопросы по тегам