R的furr future_map未使用为会话设置的ggplot主题

时间:2019-05-22 01:04:28

标签: r ggplot2 purrr furrr

我遇到了一个很奇怪的问题。我正在设置会话默认的ggplot主题(使用theme_set),然后调用使用furrr::future_map保存图表的函数。这不使用会话默认主题。但是,它可以与purrr::map一起正常工作。

我创建了一个可复制的示例,极大简化了我的实际问题。在我真正的问题中,在绘制和保存之前,我正在函数中完成其他一些计算(这就是为什么我想使用future_map来保存图形,这并不能带来太多的性能提升) )。

如果我只是在函数内进行绘图并分配给对象,则新主题将在RStudios的绘图界面中显示,但是即使我随后使用future_map保存,它仍然使用旧主题。有趣的是,如果我加载了更改默认主题的程序包cowplot,则可以正常工作。

有一个明显的解决方法,将主题设置为对象并在函数中使用p + newtheme进行添加,但是首先我很好奇为什么会发生这种情况,其次我的图已经很复杂了,几个不同的功能执行不同的操作,因此我真的很希望能够利用为主题设置会话默认值的优势。

如果furrr::future_mappurrr::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")

0 个答案:

没有答案