| --- |
| title: "Use kableExtra with formattable" |
| author: "Hao Zhu" |
| date: "`r Sys.Date()`" |
| output: html_document |
| --- |
| |
| I know you love `formattable`'s `color_tile` and `color_bar`. I do too. In my mind, these two features are among the best visualization methods in a tabular format. You may wonder if it's possible use it together with `kableExtra` so you can have a nested table with awesome presentation at the same time. Here is how. |
| |
| ```{r, message=FALSE, warning=FALSE} |
| library(knitr) |
| library(kableExtra) |
| library(formattable) |
| library(dplyr) |
| ``` |
| |
| ```{r} |
| mtcars[1:5, 1:4] %>% |
| mutate( |
| car = row.names(.), |
| mpg = color_tile("white", "orange")(mpg), |
| cyl = cell_spec(cyl, "html", angle = (1:5)*60, |
| background = "red", color = "white", align = "center"), |
| disp = ifelse(disp > 200, |
| cell_spec(disp, "html", color = "red", bold = T), |
| cell_spec(disp, "html", color = "green", italic = T)), |
| hp = color_bar("lightgreen")(hp) |
| ) %>% |
| select(car, everything()) %>% |
| kable("html", escape = F) %>% |
| kable_styling("hover", full_width = F) %>% |
| column_spec(5, width = "3cm") %>% |
| add_header_above(c(" ", "Hello" = 2, "World" = 2)) |
| ``` |
| |
| Here is a little bit more explanation. Both `formattable::color_tile` and `formattable::color_bar` returns a function object which can take a numeric vector. That's why you can put things like `(mpg)` after `color_tile("white", "orange")` as you can see in the `mutate` function. This way of using the function may look a little odd but is totally valid (, I think :P). |
| |
| Also, if you are using it in this way, make sure you put `escape = F` in `kable`. |
| |
| On the other hand, `cell_spec()` is a new function in `kableExtra()` to format cells _**before you pipe the table into `kable`**_. Note that you can either specify format (`html` or `latex`) in function or do that via `options(knitr.table.format)` so you don't need to do it everytime. |
| |
| *** |
| |
| I also added a few helper functions to use together with cell_spec. One good example is `spec_color`, which gives you the ability to use viridis color map in your table. Others include `spec_font_size` and `spec_angle`. |
| |
| ```{r} |
| iris[1:10, ] %>% |
| mutate_if(is.numeric, function(x){ |
| cell_spec(x, "html", color = spec_color(x), bold = T) |
| }) %>% |
| mutate(Species = cell_spec(Species, background = "red")) %>% |
| kable("html", col.names = c("A", "B", "C", "D", "DDDDDDDDDDD"), escape = F, align = "c") %>% |
| kable_styling("condensed", full_width = F) |
| ``` |
| |