Динамически устанавливать имена столбцов из символьной строки во флекстабле

flextable подробности справки описывают добавление новых заголовков как ввод каждого существующего имени заголовка вручную напротив каждого нового имени заголовка, например:

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

Как я могу просто добавить все новые имена заголовков из символьной строки, такой как

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

?

Пока что у меня получилось очень хакерское решение:

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

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

person J.Con    schedule 20.11.2018    source источник
comment
Как насчет изменения имен столбцов в наборе данных перед его преобразованием во флэштаблицу?   -  person morgan121    schedule 20.11.2018
comment
@ user10626943 спасибо за комментарий. Это необходимо для добавления второго заголовка в дополнение к именам столбцов фрейма данных.   -  person J.Con    schedule 20.11.2018
comment
Надеюсь, @davidgohel увидит это и ответит чем-то хорошим. Обычно он очень отзывчивый и отзывчивый :) Но у меня всегда были проблемы с тем, чтобы заставить ft работать так, как я думаю: P   -  person morgan121    schedule 20.11.2018
comment
@ user10626943 да, я заметил, что он очень помогает при поиске старых вопросов SO на ft.   -  person J.Con    schedule 20.11.2018
comment
:) да, я получаю оповещения, когда используются теги Officer / flextable, и я пытаюсь ответить, когда могу.   -  person David Gohel    schedule 20.11.2018


Ответы (2)


set_header_labels предназначен для незначительных модификаций значений заголовков. Вы можете использовать set_header_df, если хотите сопоставить имена столбцов df с набором из одной или нескольких новых строк заголовка: 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

введите описание изображения здесь

person David Gohel    schedule 20.11.2018
comment
Спасибо за быстрый ответ и отличную посылку! - person J.Con; 21.11.2018

Хорошо, после пары правок я надеюсь, что это сработает для вас.

Ваш метод тоже кажется вполне подходящим.

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
person hmhensen    schedule 20.11.2018
comment
Спасибо, это здорово. Я принял другой ответ, поскольку он был получен от создателя пакета и поэтому должен считаться технически правильным. - person J.Con; 21.11.2018
comment
Нет проблем @ J.Con. Другой ответ более прямолинейный и, как говорится, из конского рта. И спасибо за вопрос. Я давно искал такой пакет. - person hmhensen; 21.11.2018
comment
Этот ответ мне очень помогли. Я рекомендую использовать пакет tidyverse с flextable. - person J.Con; 21.11.2018