如何在R中突出显示knitr和kable包中的特定单元格

如何在R中突出显示knitr和kable包中的特定单元格,r,knitr,kable,kableextra,R,Knitr,Kable,Kableextra,我有以下数据帧: library(knitr) library(kableExtra) library(dplyr) df<- structure(list(date = c("2021-04-12", "2021-04-13", "2021-04-14","2021-04-15", "2021-04-16", "Avg", "Change", &qu

我有以下数据帧:

library(knitr)
library(kableExtra)
library(dplyr)
df<- structure(list(date = c("2021-04-12", "2021-04-13", "2021-04-14","2021-04-15", "2021-04-16", "Avg", "Change", "Change (%)"), 
               Audi = c(3.3, 3.7, 6.6, 6.9, 6.8, 6.3, 0.5, 5.5), 
               Bmw = c(1.1, 1.7, 4.1, 4.2, 4, 3.4, -2.5, -4.1), Lexus = c(9.8, 0.3,2.3, 2.2, 2, 1.4, 1.9, 3.2)), row.names = c(NA, -8L), class = "data.frame")
我发现了一个有点类似的问题,但没有弄清楚如何在代码中实现它

  • 如何突出显示除日期外所有列的(df$date==c(“更改”,“更改(%)”)行(条件:正值为绿色,负值为红色)

  • 如何用灰色突出显示除日期外所有列(df$date==c(“Avg”)的行

  • 我还发现我可以通过添加
    mutate\u all(~cell\u spec(.x,color=ifelse(.x<0,“红色”、“绿色”))
    来更改表中所有值的颜色,但是出现了一个错误

  • 使用方法中的错误(“tbl_变量”): 没有适用于“c”类对象的“tbl_vars”的适用方法(“kableExtra”、“knitr_kable”)


    我如何解决这些问题?

    我让它部分工作,也许它能帮你一点忙。您可以使用跨功能选择所需的列。我尝试使用
    where(is.numeric)
    而不是
    cross(包含(c(“奥迪”、“宝马”、“雷克萨斯”)
    (要简单得多),但它只适用于一种情况

    my_df %>% 
      # across with where(is.numeric) not working
      mutate(across(contains(c("Audi", "Bmw", "Lexus")), ~ifelse(date == "Avg",
                                                                 cell_spec(x = .x, 
                                                                           background = "gray",
                                                                           bold = TRUE,
                                                                           escape = FALSE),
                                                                 .x)),
             across(contains(c("Audi", "Bmw", "Lexus")), ~ifelse(date %in% c("Change", "Change (%)"),
                                                                 cell_spec(x = .x, 
                                                                           background = ifelse(.x < 0, 
                                                                                               "red", 
                                                                                               "green"),
                                                                           bold = TRUE,
                                                                           escape = FALSE),
                                                                 .x))) %>% 
      
      kable() %>%
      kable_classic(full_width = FALSE,
                    html_font = "Calibri")
    
    my_df%>%
    #与(is.numeric)不起作用的位置交叉
    变异(包含(c(“奥迪”、“宝马”、“雷克萨斯”),~ifelse(日期=”平均值“,
    单元规格(x=.x,
    background=“gray”,
    粗体=正确,
    逃逸=假),
    .x)),
    跨越(包含(c(“奥迪”、“宝马”、“雷克萨斯”),~ifelse(日期%)在%c(“变更”、“变更(%)”)中),
    单元规格(x=.x,
    背景=ifelse(.x<0,
    “红色”,
    “绿色”),
    粗体=正确,
    逃逸=假),
    .x))%>%
    kable()%>%
    kable_classic(全宽=假,
    html_font=“Calibri”)
    
    奇怪的是,它没有返回正确的html表。它显示:

    <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: gray !important;" >6.3</span>
    
    6.3
    
    对于所有单元格。它确实显示了正确的背景颜色,但html代码有点问题。我还尝试将
    escape=FALSE
    添加到
    cell_spec
    (在旧版中找到),但这没有任何区别。 我不知道为什么。也许这是
    knitr
    kableExtra
    中的一个bug,但我无法正确地理解它


    希望这种方法能对您有所帮助。

    在这篇文章中,使用了
    formattable
    包,但是,我需要坚持使用
    kable/knitr
    <span style=" font-weight: bold; border-radius: 4px; padding-right: 4px; padding-left: 4px; background-color: gray !important;" >6.3</span>