将HTML文件包含在RMarkdown文档中以生成HTML文档

时间:2018-02-15 01:41:07

标签: html r markdown knitr r-markdown

我一直在开发 RMarkdown 文档,以使用 knitr 包生成HTML报告。

我成功地在YAML标题中包含了一个包含 includes: 选项的HTML文件。

问题是我只能选择3个选项(https://rmarkdown.rstudio.com/html_document_format.html#includes):

  • in_header:
  • before_body:
  • after_body:

我想在我的RMarkdown文档中包含此HTML文件,例如在特定部分中。

你知道我怎么做吗?

我找到了类似的question,但答案对我没有帮助。

3 个答案:

答案 0 :(得分:4)

如果您想要包含独立 HTML文件, in_header 包含非常糟糕的做法 before_body after_body cat(readLines(...))

为什么这是一种不好的做法?

独立 HTML文件是带有标记的简单文本文件。最小HTML文件如下所示:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <title>title</title>
  </head>
  <body>
    <!-- page content -->
  </body>
</html> 

要有效,HTML文件必须符合许多约束。例如,只能有一个<body>元素。因此,如果您在另一个HTML文档中包含独立 HTML文档,则会获得一个包含两个HTML元素的<body>文件。因此,它是无效的HTML文件 这样的文件可能在浏览器中被严重渲染(大多数浏览器尝试&#34;理解&#34;它甚至无效)或者可能使其崩溃。因此,您必须选择能够生成有效 HTML文件的解决方案。

我看到两个选项来呈现有效的 HTML文件。

使用knitr子文档

请参阅有关子文档here的文档。我认为这是解决您问题的最佳解决方案。

HTML元素

中包含外部<iframe>文件

您可以在<iframe> element中嵌入任何外部HTML文件。这是一个可重复的例子。

假设您有以下名为embedded_file.Rmd

的文件
---
title: "Embedded file"
output: html_document
---

This is the content of the embedded file.

这里是main.Rmd文件的内容:

---
title: "Include external html file"
output: html_document
---

```{r generate-external-report, include=FALSE}
rmarkdown::render('embedded_file.Rmd')
```

External `HTML` file can be included in an `<iframe>` element:

```{r, echo=FALSE}
htmltools::tags$iframe(title = "My embedded document", src = "embedded_file.html")
```

当您呈现main.Rmd时,您的嵌入式文件会获得<iframe>。您必须设置<iframe>的宽度和高度才能看起来很漂亮<iframe>

答案 1 :(得分:0)

也许这是一个丑陋的黑客,但只需创建你的html文件,并在你的降价区内,创建一个像这样的代码块:

```{r, results='asis'}
cat(readLines('my_text.html'))
```

不要忘记在最后有一个空行,否则你会收到一个丑陋的警告。

也许这就是@Clock Slave所指的。

修改

由于我对此有所了解,我想至少发表评论。正如@romles指出的那样,html文件只允许有一个body标记。因此,使用我的readLines命令,您不应该阅读完整的HTML文件,但是您可以例如阅读段落或表格等。这应该不是问题。所以一个小例子可能是

<h1>My test html file</h1>
<p>Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum.</p>
<ul>
  <li>bla</li>
  <li>blubb</li>
</ul>

答案 2 :(得分:0)

为什么不使用htmltools软件包?就像这个类似的answer

```{r, echo=FALSE}
htmltools::includeHTML("my_text.html")
```