在 R Markdown 文件中包含 HTML 文件?

Posted

技术标签:

【中文标题】在 R Markdown 文件中包含 HTML 文件?【英文标题】:Include HTML files in R Markdown file? 【发布时间】:2016-07-31 04:07:02 【问题描述】:

快速总结

如何在 R Markdown 文件中放置 html 文件

详情

我通过choroplethr 创建了一些不错的动画等值线地图。

如链接所示,动画 choropleths 通过创建一组 PNG 图像来发挥作用,然后将这些图像滚动到一个 HTML 文件中循环播放图像,以显示动画。效果很好,看起来很棒。

但现在我想将这些页面嵌入/合并到 .Rmd 文件中,这样我就有了一份包含这些动画等值线以及其他工作的整体报告。

在我看来应该有一个简单的方法来做一个等价于

链接:

[please click here](http://this.is.where.you.will.go.html)

图片:

![cute cat image](http://because.that.is.what.we.need...another.cat.image.html)

图像路径正是我想要的:一个被“放大”以将信息放置到位的引用,而不仅仅是一个链接。如何使用完整的 HTML 文件而不是图像来做到这一点?有什么办法吗?

示例说明

假设我的 choropleth HTML 文件位于 './animations/demographics.html' 的本地路径中,并且我有一个 R Markdown 文件,例如:

---
title: 'Looking at the demographics issue'
author: "Mike"
date: "April 9th, 2016"
output:
  html_document:
    number_sections: no
    toc: yes
    toc_depth: 2
fontsize: 12pt
---

# Introduction

Here is some interesting stuff that I want to talk about.  But first, let's review those earlier demographic maps we'd seen.

!![demographics map]('./animations/demographics.html')

我假设/假装!! 是前身,它将完全按照我的意愿行事:允许我将该 HTML 文件嵌入到报告的其余部分中。

更新

两个更新。最近,我仍然无法正常工作,所以我把它全部推到了GitHub repository,以防有人愿意帮助我解决问题。可以在该 repo 的自述文件中找到更多详细信息。

似乎能够将 HTML 嵌入到 R Markdown 文件中会非常有用,所以我一直在尝试整理它。


(较旧的 cmets)

根据一些有用的建议,我在 R Markdown 文件中尝试并失败了:

闪亮的方法:

```r showChoro1
shiny::includeHTML("./animations/demographics.html")
```

(我还在 YAML 部分添加了runtime:Shiny。)

htmltools方法:

```r showChoro1
htmltools::includeHTML("./animations/demographics.html")
```

(在这种情况下,我没有对 YAML 进行任何更改。)

在前一种情况下(Shiny),它根本不起作用。事实上,包含 HTML 似乎完全破坏了文档的功能,因此运行时似乎永远不能完全发挥作用。 (简而言之,虽然它似乎加载了所有内容,但“加载”的纺锤从未消失。)

在后一种情况下,没有其他任何问题,但它是一个损坏的图像。奇怪的是,文档顶部有一个“choropleth player”功能区可以使用,只是没有任何图像会弹出。


为了我自己的理智,我还提供了简单的链接,效果很好。

[This link](./animations/demographics.html) worked without a problem, except that it is not embedded, as I would prefer.

因此,嵌入显然是一个挑战。

【问题讨论】:

@chinsoon12 是的,我试过了,但没用。可能是我尝试不正确,但我做了与此处(html5rocks.com/en/tutorials/webcomponents/imports)类似的操作,但没有成功。 在代码块中执行。 shiny::includeHTML 可以做你需要的。 @MikeWilliamson 你有没有想过,迈克?我也有类似的问题。 @RobertMc 不,抱歉。我从没干过。 :( 【参考方案1】:

这是一个 hack(可能不优雅)...想法是直接在 Rmd 中以编程方式插入 HTML,然后渲染 Rmd。

temp.Rmd 文件:

---
title: "Introduction"
author: "chinsoon12"
date: "April 10, 2016"
output: html_document
---

<<insertHTML:[test.html]

etc, etc, etc

```r, echo=FALSE
htmltools::includeHTML("test.html")
```

etc, etc, etc

test.html 文件:

<html>

    <head>
    <title>Title</title>
    </head>

    <body>

        <p>This is an R HTML document. When you click the <b>Knit HTML</b> button a web page will be generated that includes both content as well as the output of any embedded R code chunks within the document. You can embed an R code chunk like this:</p>

        <p>test test</p>

    </body>
</html>

用 HTML 代码替换 Rmd 代码然后渲染的冗长代码(可能会缩短很多)

library(stringi)
subHtmlRender <- function(mdfile, htmlfile) 
    #replace <<insertHTML:htmlfile with actual html code
    #but without beginning white space
    lines <- readLines(mdfile)
    toSubcode <- paste0("<<insertHTML:[",htmlfile,"]")
    location <- which(stri_detect_fixed(lines, toSubcode) )
    htmllines <- stri_trim(readLines(htmlfile))

    #render html doc
    newRmdfile <- tempfile("temp", getwd(), ".Rmd")
    newlines <- c(lines[1:(location-1)],
                  htmllines,
                  lines[min(location+1, length(lines)):length(lines)])  #be careful when insertHTML being last line in .Rmd file
    write(newlines, newRmdfile)
    rmarkdown::render(newRmdfile, "html_document")
    shell(gsub(".Rmd",".html",basename(newRmdfile),fixed=T))
 #end subHtmlRender

subHtmlRender("temp.Rmd", "test.html")

编辑:htmltools::includeHTML 也适用于我提供的示例文件。是不是因为你的特定 html 不喜欢 UTF8 编码?


编辑:将@MikeWilliamson cmets 纳入反馈

我尝试了以下

    将animated_choropleth.html 复制并粘贴到空白.Rmd 中 删除对 cloudfare.com 的引用,因为我在访问时遇到问题 渲染(见下文) 编织 HTML 放回那些 cloudfare 网络链接 将图形放在与呈现的 html 相同的文件夹中 打开 HTML

我似乎找回了 html,但不确定结果是否符合您的预期

您是否在第 2 部分也面临同样的问题?您可能想发布错误消息并要求修复:)。这是我的错误信息

pandoc.exe: Failed to retrieve http://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.1.1/css/bootstrap.min.css
FailedConnectionException2 "cdnjs.cloudflare.com" 80 False getAddrInfo: does not exist (error 11001)
Error: pandoc document conversion failed with error 61

【讨论】:

嗨@chinsoon12,这绝对看起来应该工作,但我仍然没有任何运气。代码实际上无论如何都不是秘密,所以我将它全部推送到 GitHub 存储库。如果您可以查看我在上面创建的存储库的链接,那就太棒了。否则,非常感谢您迄今为止的帮助! 嗨@chinsoon12,感谢您的跟进!我知道这个错误,它来自引导程序的问题,这是一种制作更灵活的 HTML“形状”(允许更大或更小的屏幕)的方法。我看你是对的,我只需要调整生成的 choroplethr HTML 文件本身。我不认为这是问题所在。一旦我弄清楚了,我会跟进 choroplethr 图书馆的人。再次感谢! 没问题!将有助于每个人描述错误并在编辑中修复:) 您是否尝试在 @romles 我之前没试过。你面临困难吗?如果你面临 1,你可以问一个问题。【参考方案2】:

您是否尝试过 YAML 标头中的 includes: 选项?

https://rmarkdown.rstudio.com/html_document_format.html#includes

但也许您会遇到与我相同的问题:我想将 HTML 文件包含在我的 RMarkdown 文档的特定部分中,而不是在标题或正文之前/之后。

【讨论】:

谢谢@thbtmntgn!这是一个不错的部分解决方案,但正如您所说,我希望将 HTML 嵌入/集成到文档中,而不仅仅是在正文之前或之后。所以它(完全)不适合我的情况。【参考方案3】:

可以试试把这条线放到Rmarkdown里再编织。 (YAML 标头“输出:html_document”;如果“运行时:闪亮”不知何故它不起作用)

【讨论】:

对不起,我想你误解了我想要做什么。我不是在问如何呈现 HTML 或 Shiny。我在问如何在 R 降价文档中放置整个 HTML 文件/页面。我可以在文件中剪切和粘贴 HTML 语法,但这不是很优雅,并且 HTML 文件本身是一个预先生成的、过大的乱码,就像从 R Markdown 生成的 HTML 的样子.

以上是关于在 R Markdown 文件中包含 HTML 文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Markdown 中包含资产下载链接?

如何在 Hugo/Markdown 页面中包含另一个文件?

GitHub Pages 上的 Jekyll:在另一个 markdown 文件中包含 markdown

如何链接到markdown文件(目录)中包含点(。)或逗号(,)的标题?

在 Node.js 中包含 CSS 和 JS 文件

如何在 R 中导入文件名中包含特定单词的 .csv 文件?