如何在 Rmarkdown 中的 R 块内写入乳胶块?

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

我想创建一个包含两个并排弹性表的多个实例的 PDF 文件。为此,我希望能够使用循环,因为我希望所有不同的弹性表具有通过循环提供的不同输入。为了能够并排放置两个弹性表,我使用了迷你页,为此我必须使用多个乳胶块才能使其工作(请参阅无法在 RMarkdown PDF 迷你页中包含多个弹性表)。然而,由于迷你页需要包含在循环中,因此我试图将乳胶块放入可以循环的 R 代码中。不幸的是,我无法让它发挥作用。

这是一个最小的可重复示例,说明我可以在没有循环的情况下工作:

---
output: 
  pdf_document:
    includes:
      latex_engine: xelatex
documentclass: article
header-includes:
  - \usepackage[a4paper]{geometry}
---

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

```{=latex}
\begin{minipage}[t]{0.5\linewidth}

```

```{r, Table1, warning = FALSE, message = FALSE, echo = FALSE}

library(flextable)
ft1 <- flextable(iris[1:20, 1:3])
ft1

```

```{=latex}
\end{minipage}%
\begin{minipage}[t]{0.5\linewidth}
```

```{r, Table2, warning = FALSE, message = FALSE, echo = FALSE}

ft2 <- flextable(iris[21:40, 1:3])
ft2

```

```{=latex}
\end{minipage}
```

为了将乳胶块放入 R 块中,我尝试了几种方法,包括使用 cat、asis_output(尽管据报道这在循环内不起作用)、pander 和 knitr::raw_latex(所有这些我都尝试过使用在“开始”和“线宽”之前有一个和两个反斜杠),但它们都不起作用。

如果有另一种方法可以解决这个问题,不必将乳胶块放入 R 块中,我也洗耳恭听。

loops latex r-markdown flextable
1个回答
0
投票

您可以使用

knitr::knit_child()
获取输出字符串,使用
knitr::knit_expand()
获取动态内容,以及代码块选项
results='asis'
将内容输出为原始 Markdown。

  1. 将可重用的 RMarkdown 内容(LaTeX 块、R 块等)放入字符串或文件模板中,并在需要动态内容的位置(例如

    {{...}}
    )使用
    flextable({{var1}})
    分隔占位符变量。

  2. 在模板上调用

    knitr::knit_expand()
    并传递字符串来填充模板。

  3. 在展开的字符串上调用

    knitr::knit_child()

  4. 调用

    cat()
    以使用代码块选项
    results='asis'
    输出结果。

示例(使用文件模板)

template.Rmd

```{=latex}
\begin{minipage}[t]{0.5\linewidth}
```
```{r, echo = FALSE}
flextable({{mydata[1]}})
```
```{=latex}
\end{minipage}%
\begin{minipage}[t]{0.5\linewidth}
```
```{r, echo = FALSE}
flextable({{mydata[2]}})
```
```{=latex}
\end{minipage}
```

main.Rmd

---
output: 
  pdf_document:
      latex_engine: xelatex
---

```{r, warning=FALSE, echo=FALSE}
library(flextable)
library(knitr)
```

```{r, echo=FALSE, results='asis'}
d <- rep("iris[sample.int(nrow(iris), 4), 1:3]", 2)
src <- lapply(1:2, function(i) { knit_expand("template.Rmd", mydata=d) })
res <- knit_child(text = unlist(src), quiet = TRUE)
cat(res, sep = '\n')
```

输出

链接到屏幕截图


注意:如果使用字符串模板,要处理反斜杠和反引号等特殊字符,您可以:

  • 使用原始字符串 (

    r"(...)"
    ) 防止 LaTeX 反斜杠被解析为转义序列;

  • 使用至少 4 个反引号分隔包含字符串的 R 代码块,以说明字符串中的三个反引号。

````{r, echo=FALSE}
template <- (r"(```{=latex}
\begin{minipage}[t]{0.5\linewidth}
```
<!-- ...more stuff... -->
```{=latex}
\end{minipage}
```)"
)
````

另一个区别是,调用

text
时必须使用
knit_expand()
参数:

```{r, echo=FALSE, results='asis'}
d <- c("iris[1:2, 1:3]", "iris[3:4, 1:3]")
cat(knit_child(text=knit_expand(text=template, mydata=d), quiet=TRUE))
```
© www.soinside.com 2019 - 2024. All rights reserved.