【问题标题】:How can I add a generated htmlwidget to Rmarkdown and convert it to a Word document?如何将生成的 htmlwidget 添加到 Rmarkdown 并将其转换为 Word 文档?
【发布时间】:2018-01-27 02:33:28
【问题描述】:

我想在闪亮的仪表板中创建项目的 Word 文档。仪表板包含文本、由 ggplot 和 htmlwidgets 生成的图。

word 文档的生成是通过 Rmarkdown 完成的,当我包含文本和 ggplots 时它运行良好。不过,我正在为 htmlwidgets 苦苦挣扎。我试图将从 htmlwidget 生成的 html 直接包含到文档中,但它不起作用。当我选择输出“html_document”而不是“word_document”时,它确实有效。 一些元素被包括在内,但其他一些元素似乎被忽略了。下面只是一个简单的例子,链接和图像没有出现在word文档中。有什么想法吗?

---
title: 'Title'
output: 
  word_document:
    md_extensions: +markdown_in_html_blocks
---

<html>
<head>
<meta charset="utf-8" />
<title>title</title>
<a href="https://google.com"><h2>Text without link</h2></a>
<img src="test.png">
</body>
</html>

【问题讨论】:

  • 我认为这是 webshot 包的工作
  • 这个问题很有趣,但该示例不起作用,原因如下:如Pandoc's documentation 中所述,原始HTMLHTML 中原封不动地通过并以其他格式抑制。你能提供一个最合适的例子吗?
  • 非常感谢!我已经能够通过 webshot 包将 htmlwidget 的图像添加到 word 文档中。是的,你是对的,我的示例不起作用,因为它被抑制了。

标签: r-markdown htmlwidgets


【解决方案1】:

感谢@romles 的建议,这就是我的工作方式 这与我之前的示例有点不同,因为我是在 R 代码中生成 rmarkdown 字符串。

library(htmlwidgets)
library(webshot)
library(canvasXpress)

rpt <- c("---", 
         "title: htmlwidget output", 
         paste("output: ", "  word_document"), 
         "---")

tmp_html <- tempfile(fileext = ".html")
tmp_image <- tempfile(fileext = ".png")
tmp_md  <-  "out.md"
out_docx <- "out.docx"

data <- t(iris[,1:4])
varAnnot <- as.matrix(iris[,5])
colnames(varAnnot) <- "Species"
widget <- canvasXpress(t(data), 
                       varAnnot = varAnnot, 
                       graphType = 'Scatter3D', 
                       colorBy = 'Species')

saveWidget(widget, tmp_html, selfcontained = FALSE)
webshot(tmp_html, 
        file = tmp_image, 
        vwidth = widget$width, 
        vheight = widget$height)

image_md <- paste0("![](", tmp_image, ")")
rpt <- c(rpt, image_md)

report.md <- knitr::knit(text = rpt, output = tmp_md)
rmarkdown::render(input = tmp_md, 
                  output_format = "word_document",
                  output_file   = out_docx)

【讨论】:

    【解决方案2】:

    我认为@ginberg 解决方案可以以更直接的方式简化:从knitr v1.13 开始,HTML 小部件使用webshot 包自动呈现为快照。

    设置
    首先需要安装webshotphantomjs

    install.packages("webshot")
    webshot::install_phantomjs()
    

    自动转换 htmlwidgets

    library(magrittr)
    library(canvasXpress)
    library(rmarkdown)
    
    tmp_rmd <- "out.Rmd"
    
    data <- t(iris[,1:4])
    varAnnot <- as.matrix(iris[,5])
    colnames(varAnnot) <- "Species"
    
    widget <- canvasXpress(t(data), 
                           varAnnot = varAnnot, 
                           graphType = 'Scatter3D', 
                           colorBy = 'Species')
    
    "---
    title: htmlwidget output
    ---
    ```{r, echo=FALSE}
    widget
    ```
    " %>% cat(file = tmp_rmd)
    
    render(tmp_rmd, word_document())
    

    显然,您可以永久存储out.Rmd 文件以简化代码。

    【讨论】:

    • 谢谢,我喜欢你的解决方案,它肯定更简单。
    猜你喜欢
    • 2019-11-02
    • 2016-01-20
    • 2018-02-04
    • 2019-04-21
    • 2017-09-23
    • 1970-01-01
    • 1970-01-01
    • 2015-06-03
    • 1970-01-01
    相关资源
    最近更新 更多