【问题标题】:conditionally format dynamically created table in R有条件地格式化R中动态创建的表
【发布时间】:2018-08-21 18:43:26
【问题描述】:

我想在 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 列中的颜色。但如果我只遍历第一列,它的颜色是正确的。

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

【问题讨论】:

    标签: r shiny conditional-formatting


    【解决方案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

    【讨论】:

    • 感谢您将我指向有用的软件包,但这也无法解决“动态创建的表”部分。 (我意识到我的代码 sn-p 也没有,我试图让事情变得易于处理)。有没有办法将 cell_spec() 逻辑添加到例如表的所​​有数字列?我想在事先不知道表格的维度和列名的 Shiny 应用程序中使用它。
    • “动态创建的表”是什么意思?我总是在 Shiny 中使用kableExtra 创建我的表,它们是动态的。只需将此代码包装在反应式表达式中,使其具有动态性和交互性。
    【解决方案2】:

    为了在动态表上执行此操作,您可以像这样循环 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)
    

    【讨论】:

      猜你喜欢
      • 2020-09-09
      • 2012-07-11
      • 1970-01-01
      • 2018-04-16
      • 2012-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-28
      相关资源
      最近更新 更多