Удалите флештабируемые столбцы после создания флештабируемого столбца

Я создаю файл на основе файла csv, добавляю ему стиль, меняю некоторые ячейки. Затем я хотел бы удалить определенные столбцы этого флештабируемого перед добавлением его в документ. Есть ли способ создать копию файла с указанием col_keys?

mydf <- GetData(....)
cols <- names(mydf)
myft <- flextable(mydf, col_keys = cols)
# Adding style to ft...
# ....

# Here I want to remove one column to the ft (and only here, not when first creating the ft)
# something as:
# ft <- CreateCopyOfFlextable(ft,cols[-which(cols=='COLB')])
#
my_doc <- read_docx()
my_doc <- my_doc %>%  body_add_par("")   %>%
  body_add_flextable(value = ft) 

print(my_doc, target = 'c:/temp/doc.docx')

person user11051593    schedule 15.05.2019    source источник
comment
Почему бы вам не исключить ненужную переменную в col_keys?   -  person David Gohel    schedule 15.05.2019
comment
Извините, я не понимаю. Я не могу исключить COLB при создании flextable (), поскольку мне нужен этот столбец для применения стилей, поэтому мне нужно удалить его непосредственно перед body_add_flextable   -  person user11051593    schedule 15.05.2019
comment
извиняюсь. вы задаете стиль столбцу, но не хотите его отображать?   -  person David Gohel    schedule 15.05.2019
comment
Вот пример df ‹- data.frame (COLA = c ('a', 'b', 'c'), COLB = c ('', 'changevalue', ''), COLC = c (10,12, 13)) ft ‹-flextable (df) ft‹ - ft% ›% style (i = which (ft $ body $ dataset $ COLB == 'changevalue'), pr_t = fp_text (color = black, font.size = 11 , полужирный = ИСТИНА, курсив = ЛОЖЬ, подчеркивание = ЛОЖЬ, font.family = Times New Roman), часть = тело) ft ‹-compose (ft, i = 2, j = 3, value = as_paragraph (as_chunk ('100' )), part = 'body') # теперь я хочу удалить столбцы COLB, так как они мне больше не нужны   -  person user11051593    schedule 15.05.2019


Ответы (3)


У меня была такая же проблема, и я чертовски долго искал решение в Google. @ David-Gohel действительно знает ответ здесь, но я чувствую необходимость предоставить аналогичное решение с дополнительными пояснениями.

Моя проблема и OP в том, что мы хотели использовать данные из столбцов, которые не будут отображаться, чтобы повлиять на форматирование столбцов, которые будут отображаться. Идея, которая изначально не была очевидной, заключается в том, что вы можете отправить фрейм данных в flextable с большим количеством столбцов, чем вы собираетесь отображать (вместо того, чтобы отображать все и удалять их, которые вы использовали). Затем, используя аргумент col_keys, вы можете выбрать только те столбцы, которые хотите отобразить, оставив при этом оставшиеся для дополнительной обработки (например, для использования compose(), paragraph() или add_chunk()).

Если я правильно понимаю, COLB должен быть флагом, указывающим, что определенные строки COLC должны быть изменены. Если да, то мое решение выглядит так:

library(flextable)
library(magrittr)
library(officer)

df <- data.frame(COLA=c('a', 'b', 'c'),
                 COLB=c('', 'changevalue', ''),
                 COLC=c(10, 12, 13))

ft <- flextable(df, col_keys = c("COLA", "COLC")) %>% # Retain but don't display COLB
  compose(i = ~ COLB =='changevalue', # Use COLB for conditional modifications
          j = "COLC", 
          value = as_paragraph(as_chunk('100')), 
          part = 'body')  %>% 
  style(i = ~ COLB =='changevalue', # Use COLB for conditional formatting on COLC
        j = "COLC",
        pr_t = fp_text(color = "black", 
                       font.size = 11, 
                       bold = TRUE,
                       italic = FALSE,
                       underline = FALSE,
                       font.family = "Times New Roman"),
        part = "body")

ft

И вот что производит приведенный выше код (например, столбец «changevalue» является триггером для условной вставки 100 в COLC, а также для изменения форматирования):

Example Flextable

person D. Woods    schedule 11.07.2019

Я создаю еще один столбец на основе COLB. Вот пример:

df <- data.frame(COLA=c('a','b','c'),COLB=c('','changevalue',''),COLC=c(10,12,13))
ft<-flextable(df)
ft <- ft %>% style(i=which(ft$body$dataset$COLB=='changevalue'),pr_t=fp_text(color="black",   font.size=11, bold=TRUE,  italic=FALSE, underline=FALSE, font.family="Times New Roman"),part="body")
ft<-compose(ft, i=2,j=3, value = as_paragraph(as_chunk('100')),part = 'body')
# now I want to remove the COLB columns as I don't need it anymore
# ???????
my_doc <- read_docx()
my_doc <- my_doc %>%  body_add_par("")   %>%  body_add_flextable(value = ft) 

print(my_doc, target = 'c:/temp/orliange_p/sample.docx') %>% invisible()
person user11051593    schedule 15.05.2019
comment
Я уже говорил вам не использовать x$body$dataset$..., это внутренняя структура, которая когда-нибудь может измениться. Используйте только задокументированные и экспортированные функции. - person David Gohel; 15.05.2019

person    schedule
comment
col_keys - это отображаемые переменные, а не подмножество - person David Gohel; 15.05.2019
comment
Спасибо, Дэвид, но в вашем коде я теряю 10 и 13 значений. - person user11051593; 15.05.2019
comment
Это ваш код, а не мой :) Понятия не имею, чего вы пытаетесь достичь. Просто пытался помочь;) ++ - person David Gohel; 15.05.2019
comment
Спасибо за помощь, Дэвид, я понимаю. Мне нужно переосмыслить, как использовать flextable, я не уверен, что ваше решение может быть легко интегрировано в мой код (есть другие столбцы справа от COLC и другие методы лечения. Еще раз спасибо за вашу помощь. - person user11051593; 15.05.2019
comment
Уважаемый Дэвид, у меня есть связанный с этим вопрос о вашем flextable пакете ЗДЕСЬ , не могли бы вы взглянуть, когда найдете время? - person Reza; 19.12.2019