使用delete_columns后如何重新格式化flextable?

问题描述 投票:0回答:1

我正在尝试从表对象生成一个弹性表(Rmarkdown 到 Word),而无需“as_flextable.table”附带的额外列。这是我到目前为止所拥有的:

xt<- xtabs(~mpg + cyl, head(mtcars))
ft<- as_flextable(xt, include.row_percent = FALSE, include.column_percent = FALSE, include.table_percent = FALSE)
ft

从中我可以使用“delete_rows”和“delete_columns”来删除“Total”行和列。

ft<- delete_rows(ft, i = 6, part = "body")
ft<- delete_columns(ft, j = 5)

但这会弄乱格式,我不知道如何恢复它。

如何恢复到原始格式,其中“cyl”跨越圆柱列,并且只有一个“mpg”标题?

r r-markdown flextable
1个回答
2
投票

这是实现您想要的结果的一种选择:

  1. 使用
    merge_v
    merge_h
  2. 重新合并标题行和列
  3. 重新设置底部边框线
  4. 去除右边框线
  5. 最后,运行
    fix_border_issues
library(flextable)

xt <- xtabs(~ mpg + cyl, head(mtcars))
ft <- as_flextable(xt,
  include.row_percent = FALSE,
  include.column_percent = FALSE,
  include.table_percent = FALSE
)

ft <- delete_rows(ft, i = 6, part = "body")
ft <- delete_columns(ft, j = 5)

ft <- flextable::merge_v(ft, j = 1, part = "header")
ft <- flextable::merge_h(ft, i = 1, part = "header")

# Add bottom border
ft <- hline_bottom(ft,
  j = seq_len(ncol_keys(ft)),
  border = officer::fp_border(
    color = "#666666",
    width = 1.5
  )
)
# Remove right border
ft <- vline_right(ft,
  i = seq_len(nrow_part(ft, "body")),
  border = officer::fp_border(width = 0),
  part = "body"
)
ft <- vline_right(ft,
  i = seq_len(nrow_part(ft, "header")),
  border = officer::fp_border(width = 0),
  part = "header"
)
# Fix border issues
ft <- flextable::fix_border_issues(ft)
ft

编辑这是自定义函数的可能方法:

my_flextable <- function(xt) {
  ft <- as_flextable(xt,
    include.row_percent = FALSE,
    include.column_percent = FALSE,
    include.table_percent = FALSE
  )
  
  ft <- delete_rows(ft, i = nrow_part(ft, part = "body"), part = "body")
  ft <- delete_columns(ft, j = ncol_keys(ft))

  ft <- flextable::merge_v(ft, j = 1, part = "header")
  ft <- flextable::merge_h(ft, i = 1, part = "header")

  # Add bottom border
  ft <- hline_bottom(ft,
    j = seq_len(ncol_keys(ft)),
    border = officer::fp_border(
      color = "#666666",
      width = 1.5
    )
  )
  # Remove right border
  ft <- vline_right(ft,
    i = seq_len(nrow_part(ft, "body")),
    border = officer::fp_border(width = 0),
    part = "body"
  )
  ft <- vline_right(ft,
    i = seq_len(nrow_part(ft, "header")),
    border = officer::fp_border(width = 0),
    part = "header"
  )
  # Fix border issues
  ft <- flextable::fix_border_issues(ft)
  ft
}
© www.soinside.com 2019 - 2024. All rights reserved.