Проблема построения нескольких d3heatmaps в условных с knitr

При попытке построить несколько тепловых карт d3 в условном выражении созданный HTML-код отображает только окончательную тепловую карту. Ниже приведен код RMD для воспроизведения ошибки.

---
title: "test"
output: html_document
---

This is an R Markdown document. 

```{r}
require(d3heatmap)
myVar = TRUE
if (myVar == TRUE) {
  d3heatmap(mtcars, col = "Spectral")
  d3heatmap(mtcars, col = "Blues")
}
```

Если тепловые карты находятся за пределами условных, в вязаном HTML-файле появятся несколько. Кто-нибудь еще сталкивался с этим?

sessionInfo()
R version 3.2.3 (2015-12-10)
Platform: x86_64-apple-darwin13.4.0 (64-bit)
Running under: OS X 10.11.3 (El Capitan)

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] d3heatmap_0.6.1.1

loaded via a namespace (and not attached):
 [1] htmlwidgets_0.6 magrittr_1.5    htmltools_0.3   tools_3.2.3     base64enc_0.1-3
 [6] yaml_2.1.13     stringi_1.0-1   rmarkdown_0.9.5 knitr_1.12.3    stringr_1.0.0  
[11] digest_0.6.9    evaluate_0.8.3  png_0.1-7  

1 ответ

Решение

Основная проблема объясняется в этом ответе Yihui: HTML-виджеты "работают только тогда, когда они генерируются из выражений R верхнего уровня ". Это объясняет, почему оборачивать участки в if утверждение не работает. Второй сюжет виден, тем не менее, потому что if возвращает значение последнего оцененного выражения, таким образом "поднимая" последний график на верхний уровень.

В качестве решения, графики могут быть собраны в список и распечатаны htmltools::tagList как предложено здесь:

```{r}
require(d3heatmap)
myVar = TRUE
res <- list()
if (myVar == TRUE) {
  res[[1]] <- d3heatmap(mtcars, col = "Spectral")
  res[[2]] <- d3heatmap(mtcars, col = "Blues")
}

htmltools::tagList(res)
```
Другие вопросы по тегам