首页 > 解决方案 > Rmarkdown 输出中矢量化函数中的替代文本和 ggplot 输出

问题描述

假设我有一个包含多个变量的数据集,我想通过绘制它们的分布来探索它们,例如在条形图中。我创建了一个 Rmarkdown 报告,并在矢量化函数中自动执行此绘图。很简单:

---
title: "Doc title"
output: html_notebook
---

```{r setup}
library(tidyverse, magrittr)

opts_knit$set(root.dir = ROOT_DIR)
opts_chunk$set(results = 'asis', warning = FALSE)
```

```{r dataset}
set.seed(303574)

dataset <- tibble(
  var_1 = sample.int(4, 20, replace = TRUE),
  var_2 = sample.int(7, 20, replace = TRUE)
)
```

# Histograms

```{r plot}
dataset %>% iwalk(
  ~{
    dataset %$% qplot(.x, xlab = .y, geom = "bar") %>% print()
  }
)
```

当我编织这份文件时,我得到了预期的结果。现在,我想通过为每个变量添加一个标题来创建一个部分,从而将不同部分的图分开(在这种情况下,每个变量都有一个选项卡)。

这就是我期望呈现我想要的输出:

---
title: "Doc title"
output: html_notebook
---

```{r setup}
library(tidyverse, magrittr)

opts_knit$set(root.dir = ROOT_DIR)
opts_chunk$set(results = 'asis', warning = FALSE)
```


```{r dataset}
set.seed(303574)

dataset <- tibble(
  var_1 = sample.int(4, 20, replace = TRUE),
  var_2 = sample.int(7, 20, replace = TRUE)
)
```


# Histograms {.tabset}

```{r plot, results='asis'}
dataset %>% iwalk(
  ~{
    paste0("## ", .y) %>% cat(fill = TRUE)
    dataset %$% qplot(.x, xlab = .y, geom = "bar") %>% print()
  }
)
```

然而,发生的事情是两个标题都在任何情节之前呈现。结果,每个变量都有一个空选项卡,除了最后一个,所有图都被完全渲染(在这个最小的示例中,一个空选项卡和另一个带有两个图的选项卡,而不是每个选项卡一个图)。

我将如何强制knitr交替呈现文本和绘图?我尝试了一个for循环,即:

for (var in dataset %>% colnames()) {

  paste("##", var) %>% cat(fill = TRUE)
  qplot(dataset[[var]], xlab = var, geom = "bar") %>% print()
}

但这也不起作用。

非常感谢!

PS:请注意这个问题与这个问题相似;但是,不同之处在于我正在尝试在此处添加自动呈现的标题。

更新(2020-05-06):

事实证明,这只发生在输出是笔记本时(即html_notebook);当渲染为 时html_document,图被正确放置,不再是问题。

标签: rggplot2r-markdownknitr

解决方案


您可以使用此答案中的函数来执行此操作:https ://stackoverflow.com/a/50352019/2554330 。问题是它knitr不会输出正确的 Markdown 源来做你想做的事情,所以你需要做它应该做的事情。所以定义这个函数:

encodeGraphic <- function(g) {
  png(tf1 <- tempfile(fileext = ".png"))  # Get an unused filename in the session's temporary directory, and open that file for .png structured output.
  print(g)  # Output a graphic to the file
  dev.off()  # Close the file.
  txt <- RCurl::base64Encode(readBin(tf1, "raw", file.info(tf1)[1, "size"]), "txt")  # Convert the graphic image to a base 64 encoded string.
  myImage <- htmltools::HTML(sprintf('<img src="data:image/png;base64,%s">', txt))  # Save the image as a markdown-friendly html object.
  return(myImage)
}

然后,您可以使用此代码获得所需的输出。我需要插入一些额外的换行符,否则它基本上就是你所拥有的,贯穿encodeGraphic

```{r plot, results='asis'}
dataset %>% iwalk(
  ~{
    paste0("\n## ", .y, "\n") %>% cat()
    dataset %$% qplot(.x, xlab = .y, geom = "bar") %>%
      encodeGraphic() %>% cat()
  }
)
```

推荐阅读