首页 > 解决方案 > 如何调整弹性表格中的垂直对齐方式

问题描述

我正在尝试使用 R Markdown 在 HTML 中生成一个弹性表,该表具有多个单元格,这些单元格使用ReporteRs::spanFlexTableRows(). 但是,当我将单元格合并在一起时,合并单元格中显示的数字会出现在单元格的顶部。此外,两组(相邻)合并单元格之间的边界消失了。我想知道:

  1. 如何使每个合并单元格的内容垂直居中,以及
  2. 如何保留两个合并单元格之间的边界

以下 R 脚本说明了我遇到的问题:

library(tidyverse)
library(ReporteRs)
mtcars[1:4,] %>%
mutate(
  x = row.names(mtcars[1:4,]),
  var1 = 1,
  var2 = 2
) %>%
select(
  x, mpg, cyl, disp, var1, var2
) %>%
make_ft %>%
spanFlexTableRows(j=5, from=1, to= 4) %>%
spanFlexTableRows(j=6, from=1, to= 4)

谢谢你的帮助!

标签: rr-markdown

解决方案


我对一个密切相关的问题有一个解决方案——使用officer/flextable而不是ReporteRs进行合并和垂直对齐。由于官员/弹性表格旨在取代记者,我认为在此处发布是合理的。

垂直对齐可以在 github(截至 2019-02-10)版本的 flextable 中使用 valign() 直观地完成:

library(tidyverse)
library(officer)
library(flextable)

mtcars[1:4,] %>%
  mutate(
    x = row.names(mtcars[1:4,]),
    var1 = 1,
    var2 = 2
  ) %>%
  select(
    x, mpg, cyl, disp, var1, var2
  ) %>%
  flextable() %>%
  flextable::merge_at(j=5, i=1:4) %>%
  flextable::merge_at(j=6, i=1:4) %>%
  valign(j = 5:6, valign = 'top') -> myft
myft

flextable 中的垂直对齐历史上(截至 2019-02-10 CRAN 版本)是 flextable::rotate() 函数的一部分。这是您的示例:

library(tidyverse)
# library(ReporteRs)
library(officer)
library(flextable)

# turn into flextable, merge and apply a vertical alignment 
# (note that center vertical alignment appears to be the default in flextables 
# so despite your goals i do top alignment here)
mtcars[1:4,] %>%
  mutate(
    x = row.names(mtcars[1:4,]),
    var1 = 1,
    var2 = 2
  ) %>%
  select(
    x, mpg, cyl, disp, var1, var2
  ) %>%
  flextable() %>%
  flextable::merge_at(j=5, i=1:4) %>%
  flextable::merge_at(j=6, i=1:4) %>%
  rotate(j = 5:6, align = 'top', rotation = 'tblr') -> myft

# write to a docx using officer
doc = read_docx()
doc = flextable::body_add_flextable( doc, myft )
print(doc, target = "ftex.docx" )

推荐阅读