Я столкнулся с довольно странной проблемой. Я устанавливаю тему 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")