results = 'asis'我正在使用 RMarkdown 在功能上创建一个使用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))
}
Run Code Online (Sandbox Code Playgroud)
所以我还没有找到 的替代方案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))
}
Run Code Online (Sandbox Code Playgroud)
所以我不确定为什么runifinsubchunkify未能在每次迭代中产生不同的文件名。我怀疑这与缓存的工作方式有关knitr。我注意到,如果循环的后续迭代最终通过相同的条件链来生成图 A,那么图 A 将在条件链匹配的任何地方重用。然而,如果迭代在不同的条件分支上进行以生成图 B,它将正确生成一个新图。(但是,图 B 将在具有相同条件分支结尾的所有地方重用)。
这仍然不能解释为什么我在idWorks 中引入唯一的文件名,但 usingrunif则不然,因为在这两种情况下文件名都应该是唯一的,所以这只是一个猜测。
所以我想如果其他人遇到问题,我在这里有一个解决方案,但没有解释。非常不满意,但确实有效!