несколько (R) сюжетных фигур, сгенерированных в документе Rmarkdown (knitr chunk)

Я пытаюсь создать несколько сюжетных фигур в документе Rmarkdown, используя loop или lapply.

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)

работает хорошо, но не работает при включении в чанк вязания:

---
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, но отображалась только последняя цифра.

Я подозреваю, что проблема с областью действия/окружающей средой, но я не могу найти никакого решения.


person frdbd    schedule 04.02.2016    source источник


Ответы (3)


Вместо 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 в htmlwidgets с помощью функции Plotly as.widget(). Начиная с Plotly v4, они по умолчанию являются объектами htmlwiget.

Для тех, кто интересуется техническим фоном, вы можете посмотреть этот блог. мой пост. Короче говоря, печатаются только выражения верхнего уровня.

person Yihui Xie    schedule 05.02.2016
comment
Спасибо за вашу помощь. Но это не работает. Я вижу предупреждающие сообщения: - person frdbd; 07.02.2016
comment
## Предупреждение в charToRaw(text): аргумент должен быть строкой длиной 1 (прибл. перевод) - person frdbd; 07.02.2016
comment
Похоже, что функция tagList() принимает на вход данные графиков, а не сгенерированные цифры (в js). - person frdbd; 07.02.2016
comment
Я обновил свой ответ. В основном вам нужен as.widget() из разрабатываемой версии plotly. - person Yihui Xie; 08.02.2016

Я нашел «грязное» решение, используя временный файл и связав его:

```{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)`

Но это неудовлетворительно.

person frdbd    schedule 04.02.2016
comment
Работает как шарм! - person Lucio Carlos Pimentel Paiva; 04.01.2018

Для тех, кто борется с циклом, вот что сработало для меня.

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 вне цикла.

Спасибо Yihui за помощь в этом и за огромную работу по разработке и помощи с этими инструментами.

person glacierbliss    schedule 06.02.2020