20

I have read the bookdown book and still cannot figure this out. I am trying to create a Word report through bookdown. I want to use kableExtra to add striping to my tables and also to bold my last table row. Can kableExtra be used when knitting to Word ?

This is a subset of my code :

library(dplyr)    
knitr::opts_chunk$set(echo = TRUE)
library(knitr)  # required for kable
library(kableExtra)  # required for kableExtra
options(knit.r.table.format = "markdown")

myRegion <- c("a", "b", "c")
Current_Perc_1 <- c(85.9, 90.8, 89.7)
Current_Perc_2 <- c(88.0, 91.0, 89.0)
tab_curr_est_2_times <- cbind(myRegion, Current_Perc_1, Current_Perc_2)
tab_curr_est_2_times <- as.data.frame(tab_curr_est_2_times, stringsAsFactors = FALSE)
tab_curr_est_2_times$Current_Perc_1 <- as.double(tab_curr_est_2_times$Current_Perc_1)
tab_curr_est_2_times$Current_Perc_2 <- as.double(tab_curr_est_2_times$Current_Perc_2)
tab_curr_est_2_times$curr_change_1_to_2 <- tab_curr_est_2_times$Current_Perc_2 - tab_curr_est_2_times$Current_Perc_1

tab_1_curr <- tab_curr_est_2_times
tab_1_curr[ nrow(tab_1_curr)+1 , ] <- NA
tab_1_curr$myRegion[ nrow(tab_1_curr) ] <- "BRITISH COLUMBIA"
tab_1_curr$Current_Perc_1[ nrow(tab_1_curr) ] <- 88.4
tab_1_curr$Current_Perc_2[ nrow(tab_1_curr) ] <- 89.3
tab_1_curr$curr_change_1_to_2[ nrow(tab_1_curr) ] <- 0.9

knitr::kable(tab_1_curr, digits = 1, align = "lccc", position = "c", 
         caption = "\\: my table caption here") %>%
  kable_styling("striped") %>%
  row_spec(nrow(tab_1_curr), bold = TRUE)

My bookdown settings are as follows:

--- 
title: "My Report"
author: "Me"
date: "`r Sys.Date()`"
site: "bookdown::bookdown_site"
output:
  bookdown::word_document2:
    fig_caption: true
documentclass: book
---

When I click on the Knit button in RStudio, I get this table:

I want the last row to be bold and I want the table striped. How do I do this ? (I also get the following error: "Currently generic markdown table using pandoc is not supported.")

Dan
  • 11,370
  • 4
  • 43
  • 68
JHawkins
  • 243
  • 1
  • 2
  • 10
  • 2
    If you want to create a report in *Word*, you should read about the [`officer`](https://davidgohel.github.io/officer/) package. The `kableExtra` package provides fine control for `html` and `latex` tables only. – Kevin Arseneau Dec 07 '17 at 21:53
  • Thank you @KevinArseneau. I will check out `officer`. – JHawkins Dec 07 '17 at 22:14

3 Answers3

19

This was not possible but since pandoc V2 is out, you can do it with package flextable (>= 0.4.0)(and pandoc V2). Below the code you should add into a code chunk:

library(magrittr)
library(flextable)

tab_1_curr <- structure(list(myRegion = c("a", "b", "c", "BRITISH COLUMBIA"
 ), Current_Perc_1 = c(85.9, 90.8, 89.7, 88.4), Current_Perc_2 = c(88, 
 91, 89, 89.3), curr_change_1_to_2 = c(2.09999999999999, 0.200000000000003, 
 -0.700000000000003, 0.9)), .Names = c("myRegion", "Current_Perc_1", 
 "Current_Perc_2", "curr_change_1_to_2"), row.names = c(NA, 4L
 ), class = "data.frame")


flextable(tab_1_curr) %>% 
  bold(i = ~ myRegion %in% "BRITISH COLUMBIA") %>% 
  theme_zebra() %>% 
  autofit()
David Gohel
  • 9,180
  • 2
  • 16
  • 34
9

The huxtable package is available. It includes similar table customization tools as kableExtra. huxtable is designed to output to LaTeX/PDF and HTML (similar to kableExtra). However, huxtable also includes a as_flextable function to convert a huxtable object to a flextable object, which can be output to Word (as noted by David above). After a lot of searching, it seems to me like huxtable is the only available package that can easily output to all of Word, HTML, and PDF with a single package.

Brenton Wiernik
  • 346
  • 3
  • 4
5

Pandoc version ≥2

Yes, this can be done with Pandoc (see David's answer)

Original answer follows:

Pandoc version <2

The conversion to word is made via pandoc. Currently pandoc only creates four type of tables,

  • simple tables
  • multiline_tables
  • grid_tables
  • pipe_tables

Some of those supported formats are demontrated in pander and in the pandoc manual p 35-39.

So you cannot create the stripped table currently with pandoc.

You also have a good summary of how you can use tables in rmarkdown.rstudio.

Dan Villarreal
  • 119
  • 1
  • 12
Cedric
  • 2,412
  • 17
  • 31
  • 7
    It is very refreshing to hear that it is NOT possible to knit to Word doc and use `kableExtra`. This has not been clear to me anywhere, so I appreciate it. Hopefully this will save someone hours/days of time in the future! – JHawkins Dec 14 '17 at 16:56