如何在Rmarkdown中的apply循环中生成的dygraph之间添加间距?

时间:2016-06-29 19:59:26

标签: r r-markdown dygraphs htmlwidgets

此问题与For loop over dygraph does not work in R

有关

@Yihui的回答很好地详述了如何在rmarkdown中创建一个循环中的dygraphs图。但是,正如您将注意到的那样,图之间没有间距。当有很多这种情况时,这变得非常难以阅读。

```{r}
library(dygraphs)
lungDeaths <- cbind(mdeaths, fdeaths)

res <- lapply(1:2, function(i) dygraph(lungDeaths[, i]))
htmltools::tagList(res)
```

有没有办法在自定义应用函数本身内生成的每个绘图之间添加间距,文本,水平规则等?

我目前的解决方法是传入dyOptions titleHeight参数,以及指向外部CSS的dyCSS参数,该CSS在标题顶部设置填充。例如,我可以将titleHeight参数设置为50px,然后将标题本身设置为25px,顶部填充高度为25px。

---
title: "test"
author: "test"
date: "test"
output: html_document
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = FALSE)
``` 

```{r}
library(dygraphs)
lungDeaths <- cbind(mdeaths, fdeaths)

res <- lapply(1:2, function(i) {
    dygraph(lungDeaths[, i], main = "Lung Deaths") %>%
        dyOptions(titleHeight = 50) %>%
        dyCSS("dygraph.css")
    })
htmltools::tagList(res)
```

和dygraphs.css文件:

.dygraph-title {
      font-size: 25px;
      padding-top: 25px;
}

如果我不想要一个情节标题,但仍然希望在情节之间分开,我会将一个换行符作为标题,如下所示:

```{r}
library(dygraphs)
lungDeaths <- cbind(mdeaths, fdeaths)

res <- lapply(1:2, function(i) {
    dygraph(lungDeaths[, i], main = "<br>") %>%
        dyOptions(titleHeight = 50) %>%
        dyCSS("dygraph.css")
    })
htmltools::tagList(res)
```

虽然这确实可以增加间距,但我还是希望尽可能避免使用外部CSS。更不用说,它不允许您在绘图本身之间添加任何其他对象(如文本或水平规则)。有没有办法在函数调用的每次迭代之间手动添加这些对象?

编辑:所以基于下面的答案,我们也可以在每次迭代之间添加一个中断,如下所示:

```{r}
library(dygraphs)
lungDeaths <- cbind(mdeaths, fdeaths)

res <- lapply(1:2, function(i) {
    dygraph(lungDeaths[, i])

    })

invisible(lapply(1:2, function(i) {
    if (!exists("l")) {
        l <<- list()
        }

        l[[i]] <<- htmltools::tags$br() 
    }))

out <- c(rbind(l, res))

htmltools::tagList(out)

```

这看起来还不错,虽然我有兴趣听一些其他的想法。

1 个答案:

答案 0 :(得分:2)

我对tagLists并不是很熟悉,但似乎你可以将包含附加规则,间距,文本等的标记/标记与dygraph列表交错,例如:

space <- list(htmltools::tags$h1("Title"), 
              htmltools::tags$h2("Header text"))
out <- c(rbind(space, res))
htmltools::tagList(out)

然后将依次呈现列表中的每组标签。