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
eval
和parse
的组合,但只显示最后一个数字。
我怀疑存在范围/环境问题,但我找不到任何解决方案。
【问题讨论】:
【参考方案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
将图像添加到要使用 knitr 生成的 flextable 失败但在 RMarkdown 块中有效