2016-10-20 4 views
1

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

В следующем примере показаны два столбца с очень близкими значениями (минимальное и максимальное значения равны), но имеют разную ширину, теряя графическую деталь панели («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"))) 
)) 

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

ответ

4

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

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

первого набор ширина сказать 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"), чтобы изменить цвет на розовый внутри форматировщика ,

Нужный результат выглядит, как показано ниже The Final Report

UPDATE

Или более аккуратно вы можете создать свою собственную 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"))) 
)) 
+0

Большое спасибо. Это полностью решает. С наилучшими пожеланиями! – faaabyan

 Смежные вопросы

  • Нет связанных вопросов^_^