Rmarkdown: явное указание размера рисунка графика внутри блока - PullRequest
1 голос
/ 05 мая 2020

Я использую RMarkdown для функционального создания документа, используя results = 'asis' с purrr::map. Есть несколько графиков, которые выходят из блока на каждой purrr итерации. Большинство из них имеют одинаковый размер и могут быть установлены с помощью параметров фрагмента для размера фигуры. Однако один или два должны быть другого размера. Невозможно разделить код на разные части из-за способа настройки цикла / карты.

Ближайшее, что я нашел, это http://michaeljw.com/blog/post/subchunkify/, однако когда я использую this на графике, который требует другого размера, он вызывает повторное использование графиков первой итерации, которые были выведены с помощью функции 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 ]

2 голосов
/ 05 мая 2020

Вы можете создать список всех спецификаций для графиков, а затем использовать 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

0 голосов
/ 06 мая 2020

Итак, я не нашел альтернативы subchunkify(), однако я решил проблему с повторным использованием одних и тех же графиков на каждой l oop итерации (хотя я еще не вникал, почему это было).

Я добавил аргумент 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. Я заметил, что если последующая итерация моего l oop в конечном итоге проходила через ту же условную цепочку для создания графа A, то граф A будет повторно использоваться везде, где соответствует цепочка условий. Однако, если итерация прошла в другой условной ветви для создания графа B, она правильно сгенерировала бы новый граф. (Однако тогда граф B будет повторно использован во всех местах с одним и тем же окончанием условной ветки).

Это все еще не объясняет, почему я ввел уникальное имя файла с id работает, но использование runif не Так как в обоих случаях имя файла должно быть уникальным, так что это только предположение.

Так что, я думаю, если у кого-то еще есть проблемы, у меня есть решение, но нет объяснения. Очень неудовлетворительно, но помогает!

...