如何在 Rmarkdown 的应用循环中生成的 dygraphs 之间添加间距?
How do I add spacing between dygraphs generated in apply loop in Rmarkdown?
此问题与
相关
@Yihui 的这个回答很好地详细说明了如何在 rmarkdown 中循环创建 dygraphs 图。但是,您会注意到,绘图之间没有间距。当它们很多时,这变得很难阅读。
```{r}
library(dygraphs)
lungDeaths <- cbind(mdeaths, fdeaths)
res <- lapply(1:2, function(i) dygraph(lungDeaths[, i]))
htmltools::tagList(res)
```
有没有办法在自定义应用函数本身内生成的每个图之间添加间距、文本、水平线等?
我当前的 work-around 是传递一个 dyOptions titleHeight 参数,以及一个指向外部 CSS 的 dyCSS 参数,它在标题顶部设置填充。例如,我可以将 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。更不用说,它不允许您在绘图之间添加任何其他 objects(如文本或水平线)。有没有办法在函数调用的每次迭代之间手动添加这些 objects?
编辑:所以根据下面的答案,我们还可以在每次迭代之间添加一个中断,如下所示:
```{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)
```
这看起来不错,尽管我很想听听其他想法。
我不太熟悉 tagLists,但您似乎可以将包含附加规则、间距、文本等的 markup/tags 与 dygraph 列表交织在一起,例如:
space <- list(htmltools::tags$h1("Title"),
htmltools::tags$h2("Header text"))
out <- c(rbind(space, res))
htmltools::tagList(out)
然后依次渲染列表中的每组标签。
此问题与
@Yihui 的这个回答很好地详细说明了如何在 rmarkdown 中循环创建 dygraphs 图。但是,您会注意到,绘图之间没有间距。当它们很多时,这变得很难阅读。
```{r}
library(dygraphs)
lungDeaths <- cbind(mdeaths, fdeaths)
res <- lapply(1:2, function(i) dygraph(lungDeaths[, i]))
htmltools::tagList(res)
```
有没有办法在自定义应用函数本身内生成的每个图之间添加间距、文本、水平线等?
我当前的 work-around 是传递一个 dyOptions titleHeight 参数,以及一个指向外部 CSS 的 dyCSS 参数,它在标题顶部设置填充。例如,我可以将 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。更不用说,它不允许您在绘图之间添加任何其他 objects(如文本或水平线)。有没有办法在函数调用的每次迭代之间手动添加这些 objects?
编辑:所以根据下面的答案,我们还可以在每次迭代之间添加一个中断,如下所示:
```{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)
```
这看起来不错,尽管我很想听听其他想法。
我不太熟悉 tagLists,但您似乎可以将包含附加规则、间距、文本等的 markup/tags 与 dygraph 列表交织在一起,例如:
space <- list(htmltools::tags$h1("Title"),
htmltools::tags$h2("Header text"))
out <- c(rbind(space, res))
htmltools::tagList(out)
然后依次渲染列表中的每组标签。