使用doParallel配合RMarkdown批量生成报告时数据筛选失效问题咨询
问题原因
你遇到的问题本质是RMarkdown渲染环境和并行子进程的环境隔离导致的:
- 串行执行
%do%时,所有代码运行在主进程全局环境,rmarkdown::render默认可以继承到当前环境下的iris2变量 - 并行执行
%dopar%时,每个任务运行在独立的子进程环境中,render函数默认启动独立的渲染环境,无法稳定获取到子进程中定义的iris2变量,会出现变量读取错乱、筛选失效的问题
解决方案
采用RMarkdown官方推荐的参数化报告方案,显式传递参数,完全避免环境依赖问题,修改后代码如下:
主运行R代码
library(doParallel) library(tidyverse) iris_list <- c("virginica","versicolor", "setosa") no_cores <- detectCores() - 1 cl <- makeCluster(no_cores) registerDoParallel(cl) foreach(i = 1:length(iris_list), .packages = c("tidyverse", "rmarkdown")) %dopar% { cat <- iris_list[i] iris2 <- iris %>% filter(Species == cat) rmarkdown::render( input = "report.RMD", output_file = paste0(cat, ".html"), # 显式传递参数给RMD文件 params = list( filter_data = iris2 ) ) } stopCluster(cl)
report.RMD代码
--- title: "鸢尾花物种报告" date: "28 September 2021" output: html_document params: filter_data: !r data.frame() --- ```{r table, echo=FALSE} params$filter_data
如果你需要动态修改报告标题,也可以把物种名称作为参数传入,将标题替换为`title: "`r params$species_name` 报告"`即可。 该方案完全规避了环境变量冲突的问题,即使大规模并行生成报告也不会出现数据错乱的情况。 --- 内容的提问来源于stack exchange,提问作者Basil
相关产品推荐
相关产品推荐

