有条件地格式化R中动态创建的表

时间:2018-08-21 18:43:26

标签: r shiny conditional-formatting

我想用R绘制一个表格,其中的单元格根据一些非平凡的逻辑进行格式化。 (例如,如果值是奇数,则将单元格涂成黄色;如果值也> 5,则将文本设为粗体等)。此逻辑将应用于动态创建的表的每一列,即列名未知,因此无法在代码中使用。

如果发现this JQuery方法很有用,但我不确定它是否能完全解决我的问题,而且我更喜欢基于R的方法。

我也使用condformat软件包接近了,但是由于某些原因,以下方法不起作用:

library(condformat)
data(iris)

# Create a condformat object
cf <- condformat(iris)

# Add rules to it:
for (col in colnames(iris)[1:2]) {
  cf <- cf %>% rule_css(!!col, 
expression = ifelse(eval(parse(text=col)) < 3.3, "red", "black"),
css_field = 'color')
}
# Render it
cf

结果表的第一列不遵守规则;而是使用第2列中的颜色。但是,如果我改为仅循环浏览第一列,则其颜色正确。

对于上述代码或一般问题的任何帮助,将不胜感激。

2 个答案:

答案 0 :(得分:1)

kableExtra是一个非常强大的工具,用于在R中创建HTML表。

library(kableExtra)

iris[1:10, 1:2] %>% 
  mutate(
    Sepal.Length = cell_spec(
      Sepal.Length, 
      "html", 
      background = ifelse(Sepal.Length %% 2 == 1, "yellow", "red"),
      bold = ifelse(Sepal.Length > 5, T, F)
    ),
    Sepal.Width = cell_spec(
      Sepal.Width, 
      "html", 
      background = ifelse(Sepal.Width %% 2 == 1, "blue", "green"),
      bold = ifelse(Sepal.Width > 10, T, F)
    ),
  )  %>%
  kable(format = "html", escape = F) %>%
  kable_styling("striped", full_width = F)

有关其他详细信息,请参阅文档:
Create Awesome HTML Table with knitr::kable and kableExtra

答案 1 :(得分:0)

为了在动态表上执行此操作,您可以像这样遍历data.frame的列(从Ozan147的答案中获取大部分代码):

library(kableExtra)

test <- iris[1:10, ]


for(i in 1:ncol(test)){

  if(is.numeric(test[[i]])){
      test[[i]] <- cell_spec(
                      test[[i]], 
                     "html", 
                      background = ifelse(test[[i]] %% 2 == 1, "yellow", "red"),
                      bold = ifelse(test[[i]] > 5, T, F)
                     )
  }
}

test %>%
  kable(format = "html", escape = F) %>%
  kable_styling("striped", full_width = F)