我遇到了一个很奇怪的问题。我正在设置会话默认的ggplot主题(使用theme_set
),然后调用使用furrr::future_map
保存图表的函数。这不使用会话默认主题。但是,它可以与purrr::map
一起正常工作。
我创建了一个可复制的示例,极大简化了我的实际问题。在我真正的问题中,在绘制和保存之前,我正在函数中完成其他一些计算(这就是为什么我想使用future_map
来保存图形,这并不能带来太多的性能提升) )。
如果我只是在函数内进行绘图并分配给对象,则新主题将在RStudios的绘图界面中显示,但是即使我随后使用future_map
保存,它仍然使用旧主题。有趣的是,如果我加载了更改默认主题的程序包cowplot
,则可以正常工作。
有一个明显的解决方法,将主题设置为对象并在函数中使用p + newtheme
进行添加,但是首先我很好奇为什么会发生这种情况,其次我的图已经很复杂了,几个不同的功能执行不同的操作,因此我真的很希望能够利用为主题设置会话默认值的优势。
如果furrr::future_map
和purrr::map
之间存在其他细微的差异,而这些细微的差异很容易被忽视,并且是否有办法使主题保持不变,那么有人会有所不同吗? (就像Cowplot设法做到的那样)?
编辑
我意识到加载Cowplot后的一个区别是使用了cowplot::ggsave
而不是ggplot2::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")