Furrr future_map от R не использует тему ggplot для сессии - PullRequest
0 голосов
/ 22 мая 2019

Я столкнулся с довольно странной проблемой. Я устанавливаю тему ggplot по умолчанию для сеанса (используя theme_set), затем вызываю функцию для сохранения графиков, используя furrr::future_map. Это не использует тему сессий по умолчанию. Однако он отлично работает с purrr::map.

Я создал воспроизводимый пример, который значительно упрощает мою реальную проблему. В моей реальной задаче я выполняю некоторые другие вычисления внутри функции перед построением графика и сохранением (именно поэтому я хочу использовать future_map, как я знаю, только для сохранения графиков, это не дает большого прироста производительности).

Если я просто создаю график внутри функции и назначаю объекту, тогда новая тема отображается в интерфейсе построения графиков RStudios для обоих, но даже если я затем сохраняю, используя future_map, он все равно использует старую тему. Интересно, что если я загружаю пакет cowplot, который меняет тему по умолчанию, это работает.

Существует очевидный обходной путь для установки моей темы в качестве объекта и добавления с помощью p + newtheme внутри функции, но, во-первых, мне интересно, почему это может происходить, а во-вторых, мои сюжеты уже сложны, и у меня довольно много разных функции делают разные вещи, поэтому я действительно хотел бы иметь возможность использовать настройки по умолчанию для темы.

Так у кого-нибудь есть идеи, почему они отличаются, если есть другие тонкие различия между furrr::future_map и purrr::map, которые могут легко остаться незамеченными, и если есть способ, которым я могу заставить тему придерживаться (как управляет коровник? делать)?

Редактировать Я понял, что одна разница после загрузки cowplot заключается в том, что вместо ggplot2::ggsave используется cowplot::ggsave. Я явно пытался использовать ссылки, которые ggsave использовать, и никакой разницы в результатах

ВНИМАНИЕ! В этом примере сохраняются файлы в папку C: \ temp

library(ggplot2)
library(purrr)
library(furrr)

plan(multiprocess)

testSaveplot <- function(n,data = mtcars, saveDir = "C:/temp", saveSuffix = ""){
  p <- ggplot(data, aes(wt, mpg, colour = as.factor(cyl))) + geom_point()
  ggsave(plot = p, filename = file.path(saveDir, paste0("TestingPlot",n,saveSuffix,".png")),
              width = 6, height = 6)
}

# Use overall default for both map and future map
map(1:5, testSaveplot)
future_map(1:5, testSaveplot, saveSuffix = "future")


#Create a source file to change the theme and source
sourceString <- "theme_set(theme_dark()+theme(legend.position = 'bottom'))"
writeLines(sourceString,"C:/temp/TestSource.R" )
source("C:/temp/TestSource.R")

#Run again using map and future_map - only map is plotted with new theme
map(1:5, testSaveplot, saveSuffix = "newtheme")
future_map(1:5, testSaveplot, saveSuffix = "newtheme_future")
...