Rmarkdown:明确指定块内图的图形尺寸

时间:2020-05-05 18:51:31

标签: r r-markdown

我正在使用RMarkdown在results = 'asis'purrr::map之间建立功能上的文档。在每个purrr迭代中,有多个图块产生。它们中的大多数具有相同的大小,可以使用图块大小的块选项进行设置。但是,一两个需要具有不同的大小。由于设置了循环/映射的方式,无法将代码分成不同的块。

我找到的最接近的是http://michaeljw.com/blog/post/subchunkify/,但是当我在需要不同大小的绘图上使用它时,它将导致使用print()函数输出的第一次迭代的绘图在subchunkify的中被回收。绘制位置。

是否有其他更简单的方法?还是subchunkify代码中有明显的东西可以解决?

这里是subchunkify()

subchunkify <- function(g, fig_height=7, fig_width=5) {
  g_deparsed <- paste0(deparse(
    function() {g}
  ), collapse = '')

  sub_chunk <- paste0("
  `","``{r sub_chunk_", floor(runif(1) * 10000), ", fig.height=", fig_height, ", fig.width=", fig_width, ", echo=FALSE}",
  "\n(", 
    g_deparsed
    , ")()",
  "\n`","``
  ")

  cat(knitr::knit(text = knitr::knit_expand(text = sub_chunk), quiet = TRUE))
}

2 个答案:

答案 0 :(得分:2)

您可以为图表创建所有规格的列表,然后使用purrr::pwalk

```{r, echo = FALSE, results = 'asis'}
library(ggplot2)
library(purrr)
plots <- map(1:3, ~ggplot(mtcars, aes(wt, mpg)) + geom_point())
specs <- list(plots, fig_height = 1.5, fig_width = list(2, 3, 4))
pwalk(specs, subchunkify)
```

enter image description here

答案 1 :(得分:0)

因此,我没有找到subchunkify()的替代方案,但是我确实通过在每次循环迭代中重复使用相同的图来解决了这个问题(尽管我还没有研究为什么会这样)。

我向id添加了一个subchunkify()参数,并将其包含在文件名中,然后在循环/映射中创建了一个id值,该值将是每个迭代对于每个迭代都是唯一的。

subchunkify <- function(g, fig_height=7, fig_width=5, id = NULL) {
  g_deparsed <- paste0(deparse(
    function() {g}
  ), collapse = '')

  sub_chunk <- paste0("
  `","``{r sub_chunk_", id, "_", floor(runif(1) * 10000), ", fig.height=", fig_height, ", fig.width=", fig_width, ", echo=FALSE}",
  "\n(", 
    g_deparsed
    , ")()",
  "\n`","``
  ")

  cat(knitr::knit(text = knitr::knit_expand(text = sub_chunk), quiet = TRUE))
}

因此,我不确定runif中的subchunkify为什么在每次迭代中都无法产生不同的文件名。我怀疑它与knitr缓存的工作方式有关。我注意到,如果循环的后续迭代最终经过相同的条件链以生成图A,则图A将在条件链匹配的任何地方重用。但是,如果在不同的条件分支上进行迭代以生成图B,则它将正确生成新图。 (但是,图B将在所有条件分支结束的地方重复使用。)

这仍然不能解释为什么我用id引入唯一文件名的方法是可行的,但是使用runif却没有用,因为在两种情况下文件名都应该是唯一的,因此这只是一个猜。

因此,我想如果其他任何人都遇到问题,我这里有解决办法,但没有解释。非常不满意,但是可以解决问题!