【问题标题】:Remove a flextable columns after the flextable creation创建弹性表后删除弹性表列
【发布时间】:2019-05-15 11:18:18
【问题描述】:

我创建了一个基于 csv 文件的 flextable,我在上面添加了一些样式,更改了一些单元格。然后我想删除这个 flextable before 的特定列将它添加到文档中。 有没有办法创建一个 flextable 的副本并指定 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')

【问题讨论】:

  • 为什么不排除col_keys中不需要的变量?
  • 对不起,我不明白。创建 flextable() 时我不能排除 COLB,因为我需要此列来应用样式,这就是为什么我需要在 body_add_flextable 之前删除它
  • 对不起。您设置了列的样式但不想显示它?
  • 这里是一个例子 df % style(i=which(ft$body$dataset$COLB=='changevalue'),pr_t=fp_text(color ="黑色", font.size=11, 粗体=TRUE, 斜体=FALSE, 下划线=FALSE, font.family="Times New Roman"),part="body") ft

标签: flextable


【解决方案1】:

我刚刚遇到了同样的问题,并且有时间在谷歌上搜索解决方案。 @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”列是在 COLC 中有条件地插入 100 以及更改格式的触发器):

【讨论】:

    【解决方案2】:
    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
    
    

    【讨论】:

    • col_keys 是显示的变量,不是子集
    • 谢谢大卫,但在你的代码中,我丢失了 10 和 13 个值
    • 这是你的代码,不是我的 :) 我不知道你想要实现什么。只是想帮忙;) ++
    • 感谢您的帮助,大卫,我明白了。我必须重新考虑如何使用 flextable,我不确定您的解决方案是否可以轻松集成到我的代码中(还有其他列适用于 COLC,以及其他处理方式。再次感谢您的帮助。
    • 亲爱的大卫,我有一个关于您的flextable 包裹HERE 的相关问题,请您有空时看看吗?
    【解决方案3】:

    我正在设计基于 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()
    

    【讨论】:

    • 我已经告诉过你不要使用x$body$dataset$...,这是内部结构,可能有一天会改变。仅使用记录和导出的函数。
    猜你喜欢
    • 2021-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多