有没有办法将 tabset 用于完成的 R markdown 文件

Is there a way to use tabset for finished R markdown files

所以我有17个完全独立的R markdown文件。他们 运行 很好。但是,我想将它们合并为一个并有一个标签集,以便用户可以选择一个而不是全部 17 个。

现在,我知道如何在每个 r markdown 文件中使用 tabset 了。例如,我创建的很多图表都有四个迭代,所以我使用 tabset 让用户选择哪个迭代。在这种情况下,每次迭代都基于就业的数字阈值。

例如,我创建了两个通用的 R markdowns 并命名为 test1 和 test2。使用第三个 R markdown 文件(同样,只是 file>new>R Markdown),我将如何在 tabset 中引用 test1 和 test2?

没有自动执行此操作的方法,但这里有一个使用 HTML iframe 的 hack(无论好坏)。

首先,两个假设:

  • 所有 HTML 文件都需要完整,如果它们不是“self-contained”,那么所有路径(相对或绝对)都必须适用于 parent HTML 文档也是如此;和

  • 可以有明确的命名约定或已知的文件列表;这里,我把所有的下属文件都命名为sub_*.html,这样parent文件可以很容易的找到它们,但是这部分有很多方法可以调整。只要能智能生成下面的htmlfiles就可以了

创建从属“页面”

我将其命名为 sub_base.Rmd:

---
title: "base"
output: html_document
---

```{r, echo = FALSE, message = FALSE}
plot(mpg ~ disp, data = mtcars, pch = 16)
```

姓名:sub_ggplot2.Rmd

---
title: "ggplot2"
output: html_document
---

```{r, echo = FALSE, message = FALSE}
library(ggplot2)
ggplot(mtcars, aes(disp, mpg)) + geom_point()
```

Parent 文档

我给它起个名字combine.Rmd:

---
title: "combined"
output: html_document
---

# Different Graphics {.tabset}

```{r results='asis', echo=FALSE}
htmlfiles <- list.files(".", pattern = "sub.*\.html$", full.names = TRUE)
for (html in htmlfiles) {
  hdr <- gsub("^sub_", "", tools::file_path_sans_ext(basename(html)))
  cat(
    sprintf('## %s\n\n <iframe src="%s" title="%s frame" style="position:absolute;height:60%%;width:60%%;"></iframe>\n\n',
            hdr, html, hdr)
  )
}
```

关键是你首先需要一个header,其中包含应用于它的{.tabset}样式,然后循环需要生成唯一的sub-headers。这可以通过 ## 后跟下属 ### 来完成,交给您和合并文件的其余部分 structure/aesthetics.

渲染

rmarkdown::render("sub_base.Rmd")
rmarkdown::render("sub_ggplot2.Rmd")
rmarkdown::render("combine.Rmd")

结果

您可能需要调整 iframe 组件以满足您的需要,但当页面足够大时它们会显示滚动条。

文件大小

在此示例中,我保留了制作 HTML 文件 self-contained 的默认行为。报告和两个绘图中几乎没有任何内容,这导致了 2.3M 的分布。这样做的好处是您只需要分发单个文件:呈现一个 combine.html,它嵌入了从属文档的内容。

如果您需要(无论出于何种原因)保留其中任何一个不是 self-contained,那么分布将发生变化:除了需要多个文件和子目录外,整体大小也更大:为此需要 12M例子。 (在这种情况下,您需要分发所有 sub_*.html 个文件和 sub_*_files/ 个子目录。)