ms-word - 使用 gtsummary 和 flextable 在 rmarkdown 中生成表

标签 ms-word r-markdown flextable gtsummary

大多数合作者更喜欢 word 格式的表格。随着 rmarkdown、knitr、gtsummary 和 flextable 的出现,这终于成熟了,但我无法全神贯注地思考如何在不诉诸手动设置缩进的情况下生成下面的最终表格。我认为下面的表在行之间留下了太多的空气,但我无法弄清楚如何以编程方式将行间距设置得更紧(尝试过自动调整、高度、高度、所有、hrule,但没有获得所需的输出)。相反,我使用 word 中的紧凑样式生成下面的 tbl 2。但是,然后我必须手动插入 cyl 类别的缩进。有人知道如何以编程方式完成此操作吗?


title: "testing T´s"
output:
  word_document:
    reference_docx: temp.docx
  html_document:
    df_print: paged
editor_options:
  chunk_output_type: inline
---

Plain 
====
```{r results='asis',echo=FALSE,message=FALSE}
library(gtsummary)
library(flextable)
set_gtsummary_theme(theme_gtsummary_jama())
a <- mtcars[1:20,c(1,2,9,4)] 
  b <- tbl_summary(a,
    missing="ifany",
    by=am,
    type=list(cyl~"categorical"))%>% 
      bold_labels() %>%
  add_p() %>% add_overall()
```


Flextable
====
```{r results='asis',echo=FALSE,message=FALSE}
fl <- gtsummary::as_flextable(b) %>%  font(fontname = "Bodoni 72",part = "all") %>% fontsize(size=8,part="all") %>%  autofit(add_h = -.5) 
fl
```

enter image description here

最佳答案

目前,没有简单的方法可以做到这一点。但我提供了一个代码示例,我认为它可以解决您的问题。

对于 {flextable},调用函数的顺序很重要。运行 as_flextable() 然后附加额外的调用似乎并没有得到你想要的东西。

另一种方法是保存调用,在需要的地方插入新的灵活函数调用,然后评估调用。这就是下面示例中所做的。

---
title: "Untitled"
output: word_document
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = FALSE, message = FALSE)
```


```{r}
library(tidyverse)
library(gtsummary)
library(flextable)

set_gtsummary_theme(theme_gtsummary_jama())

tbl <- 
  mtcars[1:20, c(1, 2, 9, 4)] %>%
  tbl_summary(
    missing = "ifany",
    by = am,
    type = list(cyl ~ "categorical")
  ) %>%
  bold_labels() %>%
  add_p() %>%
  add_overall()
```


### Default Flextable

```{r}
gtsummary::as_flextable(tbl)
```

### Compact Flextable

```{r}
# this function inserts additional flextable calls, then evaluates the calls
update_flextable_calls <- function(x, call_list, after) {
  # saving calls that create the flextable
  x_calls <- gtsummary::as_flextable(x, return_calls = TRUE)

  # adding new calls at `after=`
  after_n <- names(x_calls) %in% after %>% which()
  x_calls <- c(
    x_calls[1:after_n],
    call_list,
    x_calls[(after_n + 1):length(x_calls)]
  )

  # evaluating calls
  x_calls %>%
    unlist() %>%
    purrr::compact() %>%
    # concatenating expressions with %>% between each of them
    purrr::reduce(function(x, y) rlang::expr(!!x %>% !!y)) %>%
    # evaluating expressions
    eval()
}

# list of calls that make a table compact
compact_calls <- list(
  rlang::expr(font(fontname = "Bodoni 72", part = "all")),
  rlang::expr(fontsize(size = 8, part = "all")),
  rlang::expr(padding(padding.top = 0, part = "all")),
  rlang::expr(padding(padding.bottom = 0, part = "all"))
)

# adding the compact calls, and evaluating them
update_flextable_calls(
  x = tbl, # gtsummary table
  call_list = compact_calls, # calls that make flextable compact
  after = "footnote" # add calls after the "footnote" functions
) 
```

enter image description here

这显然不是一个很好的永久解决方案。我们有一个名为 theme_gtsummary_compact() 的主题,它使 {gt} 表格紧凑,字体更小,填充更少。我们可以更新主题以使 flextables 更紧凑!如果您在 GitHub 上创建一个问题来更新 flexables 的 theme_gtsummary_compact(),我会很高兴,我们可以合作制定适合您的解决方案。 https://github.com/ddsjoberg/gtsummary/issues/new/choose

关于ms-word - 使用 gtsummary 和 flextable 在 rmarkdown 中生成表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61532704/

相关文章:

r - 如何在 R 中具有多个标题行的弹性表中设置标题标签?

ms-word - 是否有控制输出页面方向的选项(使用 knit->pander->pandoc->docx)

python - 如何生成 RGBColor(0x42, 0x24, 0xE9) 格式的 RGBcolor

html - 如何在 R 中的 print() 中隐藏 [1]

latex - 减少 rmarkdown beamer 演示中代码块和代码输出之间的空间

html - 如何调整包含plotly的div以绘制尺寸,使其不与文档重叠

c# - Microsoft.Office.Interop.Word : add caption to image in C#

vb.net - 如何通过Word Interop专门对齐每个段落?

r - 将文献引用放入 Rmd 的表格中

r - 在嵌套数据框中,将信息从一个列表列传递到另一列中应用的函数