在rmarkdown(knitr chunk)文档

时间:2016-02-04 06:02:34

标签: r knitr r-markdown plotly

我尝试使用循环或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) lapplyeval的组合替换parse,但只显示了最后一个数字。

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

3 个答案:

答案 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是在循环中创建还是套用都没关系。

感谢亿辉帮助我到达那里,并为开发和使用这些工具提供了巨大的帮助。