如何将生成的htmlwidget添加到Rmarkdown并将其转换为Word文档?

时间:2018-01-27 02:33:29

标签: r-markdown htmlwidgets

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

单词文档的生成是通过Rmarkdown完成的,当我包含文本和ggplots时它很顺利。我正在努力与htmlwidgets。我试图将htmlwidget生成的html直接包含在文档中,但它不起作用。当我选择输出时,它确实有效" html_document"而不是" word_document"。 包括一些元素,但其他一些元素似乎被忽略了。下面只是一个简单的例子,链接和图像没有出现在word文档中。有什么想法吗?

mtcars_split <- 
  mtcars %>%
  split(mtcars$cyl)

plots <-
  mtcars_split %>%
  map(~ ggplot(data=.,mapping = aes(y=mpg,x=wt)) + 
        geom_jitter() 
  # + ggtitle(....))

plots

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:1)

我认为@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文件以简化代码。