kableExtra: Dynamic add_header_above labeling
Asked Answered
P

2

15

I would like to create a pdf with rmarkdown. The PDF should contain a table. The table should have a dynamic column label.

The tabhead should display the calendar week.

However, the calendar week (e.g., KW29) is not displayed but the variable name "kw0".

What is my error?

library(knitr)
library(kableExtra)
library(lubridate)
options(knitr.table.format = "latex")
loadData <- function() {# load some data}

myData<- loadData ()

kw0 <- paste("KW", week(Sys.Date()) - 1, sep = "")
kw1 <- paste("KW", week(Sys.Date()), sep = "")
kw2 <- paste("KW", week(Sys.Date()) + 1, sep = "")
kw3 <- paste("KW", week(Sys.Date()) + 2, sep = "")


kable(myData, row.names = FALSE, booktabs = T) %>%
  kable_styling(
  full_width = TRUE,
  font_size = 14 
  )  %>% add_header_above(header = c(" " = 1, kw0 = 2, kw1 = 2, kw2 = 2, kw3 = 2))

I am glad about your advice.

Possessory answered 20/7, 2017 at 6:32 Comment(0)
P
16

To create a dynamic header, use a named character vector with colspan(s) as values.

You can assign names to the vector with the function names():

library(knitr)
library(kableExtra)
library(lubridate)
options(knitr.table.format = "latex")

loadData <- function() {# load some data}

myData<- loadData()

kw0 <- paste("KW", week(Sys.Date()) - 1, sep = "")
kw1 <- paste("KW", week(Sys.Date()), sep = "")
kw2 <- paste("KW", week(Sys.Date()) + 1, sep = "")
kw3 <- paste("KW", week(Sys.Date()) + 2, sep = "")
    
# create vector with colspans
myHeader <- c(1, 2, 2, 2, 2)

# set vector names 
names(myHeader) <- c(" ", kw0, kw1, kw2, kw3)

# Assign dynamic named vector
kable(myData, row.names = FALSE, booktabs = T) %>%
  kable_styling(
    full_width = TRUE,
    font_size = 14 
  ) %>% 
  add_header_above(header = myHeader)
Possessory answered 20/7, 2017 at 8:6 Comment(1)
myHeader <- c(2, 2, 2) and names(myHeader) <- c("n1", "n2", "n3")Francesfrancesca
H
10

An easy and quick method using setNames() is described on the kableExtra developer's github page: https://github.com/haozhu233/kableExtra/issues/415

library(knitr)
library(kableExtra)
library(lubridate)
options(knitr.table.format = "latex")

loadData <- function() { # load some data
}

myData<- loadData()

kw0 <- paste("KW", week(Sys.Date()) - 1, sep = "")
kw1 <- paste("KW", week(Sys.Date()), sep = "")
kw2 <- paste("KW", week(Sys.Date()) + 1, sep = "")
kw3 <- paste("KW", week(Sys.Date()) + 2, sep = "")

kable(myData, row.names = FALSE, booktabs = T) %>%
  kable_styling(
    full_width = TRUE,
    font_size = 14 
  ) %>% 
add_header_above(header = c(" " = 1, 
                            setNames(2,kw0), 
                            setNames(2,kw1), 
                            setNames(2,kw2), 
                            setNames(2,kw3))
Haws answered 17/9, 2019 at 9:22 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.