【问题标题】:Include HTML file into RMarkdown document to generate HTML document将 HTML 文件包含到 RMarkdown 文档中以生成 HTML 文档
【发布时间】:2023-03-25 08:45:01
【问题描述】:

我一直在开发一个 RMarkdown 文档来生成带有 knitr 包的 HTML 报告。

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

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

  • in_header:
  • before_body:
  • after_body:

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

你知道我该怎么做吗?

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

【问题讨论】:

  • 你可以为 RMarkdown 生成 HTML,然后在你喜欢的地方添加你的 HTML sn-p。
  • 关于您想要包含的html 文件的问题:是html 片段 还是html 独立 文件?
  • 这是一个html独立文件

标签: html r markdown knitr r-markdown


【解决方案1】:

如果您想包含一个独立 HTML 文件,将它包含在 in_header 中是一种非常糟糕的做法before_bodyafter_bodycat(readLines(...))

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

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

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

要有效,HTML 文件必须符合许多约束条件。例如,只能有一个 &lt;body&gt; 元素。因此,如果您在另一个HTML 文档中包含独立 HTML 文档,您将获得一个带有两个&lt;body&gt; 元素的HTML 文件。所以,这是一个无效的HTML 文件。
这样的文件可能会在浏览器中被严重渲染(大多数浏览器尝试“理解”它,即使它是无效的)或者可能会导致它崩溃。因此,您必须选择一个产生有效 HTML 文件的解决方案

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

使用knitr子文档

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

&lt;iframe&gt; 元素中包含外部HTML 文件

您可以在&lt;iframe&gt; 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 时,您会得到一个带有嵌入文件的&lt;iframe&gt;。您必须设置&lt;iframe&gt; 的宽度和高度才能获得好看的&lt;iframe&gt;

【讨论】:

  • 您的评论完全正确,在readLines 代码块中使用readLines 是一种不好的做法,我相应地更新了我的答案。我想知道这是否仍然是一个坏主意。
  • 您的编辑是正确的:html fragment 没有问题。区分 html standalone 和 html fragment 很重要。但是,问题是关于包含 html standalone 文件。
  • 谢谢,它似乎与
【解决方案2】:

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

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

【讨论】:

  • 这非常适合与htmltoools::includeMarkdown()结合使用
【解决方案3】:

也许这是一个丑陋的 hack,但只需创建您的 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>

【讨论】:

    猜你喜欢
    • 2015-10-23
    • 2021-08-20
    • 1970-01-01
    • 2010-10-19
    • 2013-09-28
    • 2010-09-27
    • 1970-01-01
    • 2015-02-22
    • 2012-03-27
    相关资源
    最近更新 更多