Search code examples
rflextableofficer

Dynamically set colnames from character string in flextable


The flextable help details describes adding new headers as manually typing each existing header name against each new header name, like this:

library(flextable)
ft_1 <- regulartable(head(iris))
ft_1 <- set_header_labels(ft_1, Sepal.Length = "SL",
                          Sepal.Width = "SW", Petal.Length = "PL",
                          Petal.Width = "PW"
)
ft_1

How can I just add all new header names from a character string such as

(names2<-c('SL','SW','PL','PW','SPECIES'))
[1] "SL"      "SW"      "PL"      "PW"      "SPECIES"

?

So far I have managed a very hacky solution:

names(names2)<-names(ft_1$header$dataset[1,])

ft_1$header$dataset[1,]<-names2

Solution

  • set_header_labels is made for minor modifications of header values. You can use set_header_df if you want to map df column names with a set of one or more new header rows: https://davidgohel.github.io/flextable/articles/layout.html#define-headers-with-a-reference-table

    library(flextable)
    
    names1 <- c("Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width", "Species")
    names2 <- c('SL','SW','PL','PW','SPECIES')
    
    ft <- flextable( head( iris ) )
    ft <- set_header_df(x = ft, mapping = data.frame(keys = names1, values = names2, stringsAsFactors = FALSE),
                  key = "keys" )
    
    # the following call is needed as header formats have been 
    # replaced by vanilla formats when set_header_df() has been called
    ft <- theme_booktabs(ft) 
    ft
    

    enter image description here