J.Con
J.Con

Reputation: 4309

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

Upvotes: 7

Views: 1372

Answers (2)

David Gohel
David Gohel

Reputation: 10675

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

Upvotes: 6

hmhensen
hmhensen

Reputation: 3195

OK, after a couple edits I hope this works for you.

Your method seems plenty fine as well.

names1 <- c("Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width", "Species")
names2 <- c('SL','SW','PL','PW','SPECIES')

ft <- flextable( head( iris ),
                   col_keys = names1 )

oldHeaders <- names1
newHeaders <- names2

headerlist <- setNames(as.list(newHeaders), 
                       oldHeaders)

ft <- do.call(set_header_labels, c(list(x = ft, top = F), headerlist))
ft

Upvotes: 1

Related Questions