我尝试使用循环或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 chunk中时失败:
---
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
,但只显示了最后一个数字。
我怀疑存在范围/环境问题,但我找不到任何解决方案。
答案 0 :(得分:6)
而不是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对象。
答案 1 :(得分:3)
我通过使用临时文件并编织它找到了一个“脏”的解决方案:
```{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 :(得分:0)
对于任何陷入循环困境的人来说,这就是对我有用的方法。
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
,列表htmltools::tagList
是在循环中创建还是套用都没关系。
感谢亿辉帮助我到达那里,并为开发和使用这些工具提供了巨大的帮助。