Search code examples
rkablekableextraformattable

Missing symbols when combining formattable and kableExtra when creating a data-table in R


I'm attempting to combine the use of R packages formattable and kableExtra to create a data-table. Using formattable, I'm adding a green thumbs up symbol to one particular column ("b") for numbers > 0, this displays correctly. I then pass my table to "kable" so that I can add the "hover" feature, widen column 1, and add grouped headers. However, whilst the produced data-table correctly displays the "hover" feature and correct grouped headers, the green thumbs up feature (derived from formattable) is missing.

Here is a minimal, reproducible example:

library(formattable)
library(kableExtra)
library(dplyr)

labels <- c("A", "B", "C")

a <- c(0.22, 0.28, 0.23)
b <- c(890.53, 346.84, 1119.63)
c <- c(6.56, 5.70, 4.59)
d <- c(0.0048, -0.3194, -0.2720)
e <- c(-0.3212, 0.1280,  0.0755)
f <- c("-", "-", "-")

df <- tibble(labels,a,b,c,d,e,f)

customGreen = "#71CA97"

# function to assign a thumbs up to numbers > 0
custom_thumb <- formatter("span", style = x ~ style(font.weight = "bold", 
                                                     color = ifelse(x > 0, customGreen, ifelse(x < 0, customRed, "black"))), 
                                   x ~ icontext(ifelse(x > 0, "thumbs-up", ""), x)
)

# use formattable to add thumbs up symbols 
df_frmt <- formattable(df, align =c("l","c","c","c","c","c","c"), 
           list(`labels` = formatter("span"), 
           `b` = custom_thumb))

# pass the resulting table to kable for further edits
df_kbl <- kbl(df_frmt, escape = T) %>%
          kable_styling("hover", full_width = F) %>%
          column_spec(1, width = "5cm") %>%
          add_header_above(c(" "=2, "Group 1" = 2, "Group 2" = 2, " " = 1))
df_kbl

Given that the hover feature and grouped headers is working well, is the issue something to do with escaping html? I've tried both "escape=T" and "escape=F" in the kable edit though there's no change. I know that both of these packages can be used together from reading the "Integration with formattable" section of this website. I don't know if it's relevant or not, but I'm running this code in an RMarkdown file inside RStudio. Any helps is appreciated!


Solution

  • Following your mentioned link, combining formattable and kableExtra is not done by passing a formattable to the kbl function.
    Instead you might use custom (your custom_thumb) or original functions (color_bar or color_tile) from formattable and integrate them into the kableExtra syntax.

    df %>% 
      mutate(b = custom_thumb(b)) %>%
      kable("html", escape = F, align = c("l","c","c","c","c","c","c")) %>%
      kable_styling("hover", full_width = F) %>%
      column_spec(1, width = "5cm") %>%
      add_header_above(c(" " = 2, "Group 1" = 2, "Group 2" = 2, " " = 1))
    

    enter image description here