Rmarkdown(knitr chunk)文档中生成的多个(R)绘图图形

Posted

技术标签:

【中文标题】Rmarkdown(knitr chunk)文档中生成的多个(R)绘图图形【英文标题】:multiple (R) plotly figures generated in a Rmarkdown (knitr chunk) document 【发布时间】:2016-05-13 15:03:49 【问题描述】:

我尝试使用循环或 lapply 在 Rmarkdown 文档中创建多个绘图图形。

R 脚本:

require(plotly)
data(iris)
b <- lapply(setdiff(names(iris), c("Sepal.Length","Species")),
            function(x) 
              plot_ly(iris, 
                      x = iris[["Sepal.Length"]],
                      y = iris[[x]], 
                      mode = "markers")
            )
print(b)

效果很好,但是当包含在 knitr 块中时会失败:

---
output: html_document
---

```r,results='asis'
require(plotly)
data(iris)
b <- lapply(setdiff(names(iris), c("Sepal.Length","Species")),
            function(x) 
              plot_ly(iris, 
                      x = iris[["Sepal.Length"]],
                      y = iris[[x]], 
                      mode = "markers")
            )
print(b)
```

我尝试将print(b) 替换为lapply evalparse 的组合,但只显示最后一个数字。

我怀疑存在范围/环境问题,但我找不到任何解决方案。

【问题讨论】:

【参考方案1】:

我通过使用临时文件并编织它找到了一个“肮脏”的解决方案:

```r,echo=FALSE
mytempfile<-tempfile()
write("```r graphlist,echo=FALSE\n",file=mytempfile)
write(paste("p[[",1:length(p),"]]"),file=mytempfile,append = TRUE)
write("\n```",file=mytempfile,append = TRUE)
```

`r knit_child(mytempfile, quiet=T)`

但这并不令人满意。

【讨论】:

像魅力一样工作!【参考方案2】:

代替print(b),将b 放入htmltools::tagList(),例如

```r
library(plotly)

b <- lapply(
  setdiff(names(iris),
          c("Sepal.Length","Species")),
  function(x) 
    plot_ly(iris, 
            x = iris[["Sepal.Length"]],
            y = iris[[x]], 
            mode = "markers")
  
)

htmltools::tagList(b)
```

注意:在 Plotly v4 之前,需要使用 Plotly 的 as.widget() 函数将 Plotly 对象转换为 htmlwidgets。从 Plotly v4 开始,它们默认是 htmlwiget 对象。

对技术背景感兴趣的朋友可以看this blog post of mine。简而言之,只有 *** 表达式会被打印出来。

【讨论】:

感谢您的帮助。但它不起作用。我看到警告消息: ## charToRaw(text) 中的警告:参数应该是长度为 1 的字符串(大约翻译) 看起来函数 tagList() 将绘图数据作为输入而不是生成的图形(在 js 中)。 我已经更新了我的答案。基本上你需要 plotly 的开发版本中的as.widget()【参考方案3】:

对于任何在循环中苦苦挣扎的人,这对我有用。

p=list()
for (n in 1:3)
  p[[n]] <- plot_ly(x = 1:100, y = rnorm(100)+n, mode = 'lines', type="scatter")

htmltools::tagList(p)

即列表p是在循环中创建还是在lapply等中创建都没有关系,只要你在循环外调用htmltools::tagList即可。

感谢 Yihui 帮助我实现目标,并在开发和帮助这些工具方面付出了巨大的努力。

【讨论】:

以上是关于Rmarkdown(knitr chunk)文档中生成的多个(R)绘图图形的主要内容,如果未能解决你的问题,请参考以下文章

带有 knitr 和 Rmarkdown 的 Unicode

如何在rmarkdown中调整注视表的字体大小?

将图像添加到要使用 knitr 生成的 flextable 失败但在 RMarkdown 块中有效

在Rmarkdown文档中调整嵌入式Shiny App的大小

使用 Rmarkdown 编织到 pdf 时遇到麻烦

在knitr / rmarkdown中作为png plotly