Equal column widths on R formattable

时间:2016-10-20 18:50:36

标签: r report htmlwidgets formattable

I am using the formattable package to make some reports directly from R and I need the columns using the normalize_bar "style" have the same width, so that can compare value between columns.

The following example shows two columns that have very similar values (minimum and maximum values are equal) but have a different width, losing the graphic detail of the bar ("Test.number.1.score" and "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")))
))

Thanks in advance.

1 个答案:

答案 0 :(得分:4)

直接使用格式化程序解决了这个问题。您希望两列都具有相同的宽度。

当我查看color_bar函数的代码时,我发现它们是有色部分宽度的宽度属性。基本上我正在修改该属性以获得所需的结果。

首先设置宽度为150 px

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

<强>更新

或者更干净地,您可以通过更改其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")))
))