Knitr和Rmarkdown docx表

zac*_*dav 31 r docx pandoc knitr r-markdown

使用knitrrmarkdown一起创建word文档时,可以使用现有文档来设置输出样式.

例如在我的yaml标题中:

output: 
  word_document:
    reference_docx: style.docx
    fig_caption: TRUE
Run Code Online (Sandbox Code Playgroud)

在这种风格中,我创建了一个默认的表格样式 - 这里的目标是让kable表格输出的样式正确.

当我编写word文档并使用style.docx时,表格不会根据表格进行样式化.

到目前为止,使用样式检查器没有帮助,不确定默认表格样式是否是要修改的错误样式.

示例代码:

```{r kable}
n <- 100
x <- rnorm(n)
y <- 2*x + rnorm(n)
out <- lm(y ~ x)
library(knitr)
kable(summary(out)$coef, digits=2, caption = "Test Captions")
```
Run Code Online (Sandbox Code Playgroud)

不幸的是,我没有可以上传的程式化文档进行测试.

TL; DR:想要自动设定rmarkdown和knitr的表输出(通过kable)

更新:到目前为止,我发现更改docx中的"紧凑"样式将自动更改表格的文本内容 - 但这并不能解决整个表格样式,如单元格颜色和对齐方式.

更新2:经过更多研究和创建样式后,我发现knitr访问段落样式似乎没有问题.但是表格样式不属于该样式类别,似乎不适用于我的个人测试.

更新3:涉及ReporteRs软件包 - 虽然它能够生成表格,但是这样做所需的语法很费力.更确切地说,风格会自动应用.

更新4:您不能更改TableNormal样式,也不能设置表格正常样式.XML方法不是我们想要的.我有一个VBA宏可以做到这一点,只是想尽可能删除该过程.

CL.*_*CL. 16

这实质上是一个组合是建议的答案TableNormal,这个职位上rmarkdown.rstudio.com和我自己的实验来说明如何使用TableNormal风格像定制所产生的这些表kable:

RMD:

---
output:
  word_document
---

```{r}
knitr::kable(cars)
```
Run Code Online (Sandbox Code Playgroud)
  • 点击RStudio中的"Knit Word".→文档在Word中打开,没有任何自定义样式.
  • 在该文档中(不在新文档中),添加所需的样式.本文介绍了基础知识.关键不是应用直接样式,而是修改样式.有关Word中的样式基础知识,请参阅support.office.com上的这篇文章.
  • 具体来说,要为表格设置样式,您需要添加表格样式.我的Word版本是非英语的,但根据上面链接的文章,表格样式可以通过"设计选项卡,在表工具上下文选项卡上"获得.
  • 选择TableNormal样式名称并定义所需的样式.在我的实验中,大多数样式都有效,但有些样式没有.(向第一列添加颜色并使第一行变为粗体没有问题;忽略每一秒的突出显示.)此答案中的最后一个屏幕截图说明了此步骤.
  • 保存文档,例如styles.docx.
  • 修改RMD文件中的标题以使用参考DOCX(参见此处 ;不要搞砸缩进 - 让我花了10分钟找到这个错误):

    ---
    output:
      word_document:
        reference_docx: styles.docx
    ---
    
    Run Code Online (Sandbox Code Playgroud)
  • 再次编织到DOCX - 现在应该应用样式.

按照上面描述的步骤生成此输出:

产量

这里是用于定义的表格样式对话框的屏幕截图TableNormal.不幸的是它是德语,但也许有人可以提供它的英文版本:

表格式


因为这似乎对大多数用户(除了我......以外的任何人)都有用,我建议我们系统地测试一下.基本上,有4个步骤可能出错:

  • 错误的RMD(不太可能).
  • 最初生成的DOCX的差异.
  • TableNormalDOCX中保存样式的方式不同.
  • 参考DOCX如何用于格式化最终DOCX的差异.

因此,我建议使用上面发布的相同的最小RMD(在pastebin上的完整代码)来找出结果开始的位置不同:

这三个文件在以下系统上生成:Windows 7/R 3.3.0/RStudio 0.99.896/pandoc 1.15.2/Office 2010.

我在使用Windows 7/R 3.2.4/RStudio 0.99.484/pandoc 1.13.1/Office 2010的系统上获得了相同的结果.

我想最可能的罪魁祸首是pandoc和Office版本.不幸的是,我目前无法测试其他配置.现在看到以下内容会很有趣:对于不起作用的用户,会发生什么......

  • ...如果你从我的initial.docx开始?
  • 如果这不起作用,如果您使用我的reference.docx作为参考文档怎么办?
  • 如果没有任何效果,生成的XML文件(在DOCX容器内)是否存在引人注目的差异?请分享您的文件和确切的版本信息.

有许多用户运行这些测试,应该可以找出导致问题的原因.


Lia*_*ang 6

这实际上是一个已知问题。幸运的是,它在 v2.0 或更高版本的pandoc.

而且我测试了较新的版本,发现有一个新添加的隐藏样式,叫做“表格”。按照@CL. 的建议更改“表格”样式reference.docx现在就可以了。

另外,看看pandocv2.0发布说明的这个条目:

使用Table而不是Table Normal用于表格样式(#3275)。Table Normal是默认的表格样式,不能修改。


Ral*_*lph 6

截至 2021 年,我无法获得任何其他建议的答案。

然而,我确实发现了这个{officedown}包,除其他外,它支持文档中表格的样式.docx。您可以{officedown}安装remotes::install_github("davidgohel/officedown")

要用于{officedown}渲染.Rmd.docx您必须替换

output:
  word_document
Run Code Online (Sandbox Code Playgroud)

在你的文档标题中

output:
  officedown::rdocx_document
Run Code Online (Sandbox Code Playgroud)

除此之外,该{officedown}包必须加载到您的.Rmd.

word_document输出格式一样,{officedown}允许我们使用模板文档中的样式和设置,同样使用reference_docx参数。

通过参考文档styles.docx,一个最小的示例.Rmd可能如下所示:

---
date: "2038-01-19"
author: "The Reasonabilists"
title: "The end of time as we know it"
output: 
  officedown::rdocx_document:
    reference_docx: styles.docx
---

```{r setup, include = FALSE}
# Don't forget about me: I'm important!
library("officedown")
```
Run Code Online (Sandbox Code Playgroud)

{officedown}允许我们更进一步,指定要在文档的前面内容中使用的表格样式的名称。该表格样式可以是我们在 中创建的自定义样式styles.docx,也可以是您喜欢的 Word 内置样式之一。

假设我们创建了一种样式My Table

在此输入图像描述

我们可以{officedown}在前面的内容中使用这种表格样式:

---
date: "2038-01-19"
author: "The Reasonabilists"
title: "The end of time as we know it"
output: 
  officedown::rdocx_document:
    reference_docx: styles.docx
---

```{r setup, include = FALSE}
# Don't forget about me: I'm important!
library("officedown")
```
Run Code Online (Sandbox Code Playgroud)

总而言之,编织最小的.Rmd

---
date: "2038-01-19"
author: "The Reasonabilists"
title: "The end of time as we know it"
output: 
  officedown::rdocx_document:
    reference_docx: styles.docx
    tables:
      style: My Table
---

```{r setup, include = FALSE}
# Don't forget about me: I'm important!
library(officedown)
```

```{r}
head(mtcars)
```
Run Code Online (Sandbox Code Playgroud)

生成的.docx文档如下所示:

在此输入图像描述