Rmarkdown:显式指定块内绘图的图形大小

Rmarkdown:显式指定块内绘图的图形大小,r,r-markdown,R,R Markdown,我正在使用RMarkdown功能性地创建一个文档,使用results='asis'和purrr::map。在每次purrr迭代中,都有多个从块中出来的图。它们中的大多数大小相同,可以使用图大小的块选项进行设置。然而,一个或两个需要有一个不同的大小。由于循环/映射的设置方式,不可能将代码分成不同的块 但是,我发现最接近的是,当我在需要不同大小的绘图上使用它时,它会导致使用print()函数输出的第一次迭代的绘图在subchunkify的绘图位置中循环 有没有一种不同的,不太老套的方法来做到这一点?

我正在使用RMarkdown功能性地创建一个文档,使用
results='asis'
purrr::map
。在每次
purrr
迭代中,都有多个从块中出来的图。它们中的大多数大小相同,可以使用图大小的块选项进行设置。然而,一个或两个需要有一个不同的大小。由于循环/映射的设置方式,不可能将代码分成不同的块

但是,我发现最接近的是,当我在需要不同大小的绘图上使用它时,它会导致使用print()函数输出的第一次迭代的绘图在subchunkify的绘图位置中循环

有没有一种不同的,不太老套的方法来做到这一点?或者,在subchunkify代码中是否有一些明显的东西是可以修复的

下面是
subchunkify()


subchunkify您可以为绘图创建所有规格的列表,然后使用
purr::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)
```
`{r,echo=FALSE,results=asis}
图书馆(GG2)
图书馆(purrr)

绘图所以我还没有找到
subchunkify()
的替代方法,但是我确实解决了这个问题,在每次循环迭代中重用相同的绘图(尽管我还没有深入探究为什么会这样)

我在
subchunkify()
中添加了一个
id
参数,并将其包含在文件名中,然后在我的循环/映射中创建了一个
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))
}

subchunkify这不是问题所在。问题在于,尽管使用了runif(),但在循环的每次迭代中,文件似乎都以相同的文件名结束。
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))
}