R中tidy函数在future_map内调用处理lmerMod对象报错如何解决?
报错诱因
你使用的multisession并行模式会启动独立的后台R工作进程,这类进程默认不会继承主进程加载的R包命名空间。你的fun1函数依赖多个扩展包的特定方法,子进程未预加载对应包时就会触发报错:
- 针对
lmerMod/merMod类对象的tidy()方法由broom.mixed包提供,基础broom包本身不支持lmer类的tidy转换,子进程未加载broom.mixed时就找不到适配的方法 - 此外
fun1用到的lmer()来自lme4包、analysis()来自rsample包、管道符%>%来自dplyr/magrittr包,这些依赖也需要子进程可调用
原本的map()是在主进程串行运行,主进程已经加载了所有需要的包,因此运行正常。
解决方法
方法1:显式声明子进程需要加载的包
在future_map的参数中指定子进程需要预加载的依赖包即可,修改最后一步的mutate代码:
# furrr 2.0+ 版本写法 mutate(model = future_map(splits, fun1, .options = furrr_options(packages = c("lme4", "broom.mixed", "rsample", "dplyr")))) # 旧版本furrr写法 mutate(model = future_map(splits, fun1, .packages = c("lme4", "broom.mixed", "rsample", "dplyr")))
方法2:自定义函数内显式指定包名前缀
直接在fun1里给每个函数加上所属包的前缀,不需要额外配置并行参数,兼容性更强:
fun1 <- function(data) { data %>% rsample::analysis() %>% lme4::lmer(val ~ period + (1 | id), data = .) %>% broom.mixed::tidy() }
只要子进程环境中已经安装了对应包,就能正常运行。
方法3:更换并行模式(仅适用于Linux/macOS)
如果你的运行环境不是Windows,可以把并行计划替换为plan(multicore),该模式下子进程会完全继承主进程的工作环境和已加载的包,不需要额外配置即可正常运行。
内容的提问来源于stack exchange,提问作者YanLi
相关产品推荐
相关产品推荐

