Удалить гибкие столбцы после создания гибкой таблицы - PullRequest
1 голос
/ 15 мая 2019

Я создаю гибкую таблицу на основе 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')

Ответы [ 3 ]

1 голос
/ 15 мая 2019
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", "COLB"))
ft <- ft %>% 
  style(i= ~ 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="COLB", value = as_paragraph(as_chunk('100')),part = 'body')
ft

0 голосов
/ 11 июля 2019

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

Моя проблема и ОП заключаются в том, что мы хотели использовать данные из столбцов, которые не будут отображаться, чтобы повлиять на форматирование столбцов, которые будут отображаться. Концепция, которая изначально не была очевидной, заключается в том, что вы можете отправить фрейм данных на 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

0 голосов
/ 15 мая 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()
...