为何使用future与rsample进行并行Bootstrap时执行失败?
解决future并行结合rsample Bootstrap的转换报错问题
问题根源
future的multisession采用独立进程运行,和parallel::mclapply的fork模式不同——fork会直接继承父进程的所有数据环境,而独立进程无法自动解析rsplit/boot_split对象的索引引用。这类对象本身不是完整数据框,只是指向原始数据的索引,在独立进程里无法自动转换成数据框,所以触发as.data.frame报错。而顺序执行和fork模式下,进程能直接访问原始数据集,索引可以正常映射,因此不会出问题。
修复方案
修改自定义函数,用rsample::analysis()显式提取rsplit对象里的训练数据,不要直接把rsplit传给lm的data参数。
完整可运行代码
library(rsample) library(broom) library(purrr) library(furrr) library(future.apply) plan(multisession) # 生成Bootstrap样本 splits <- rsample::bootstraps(mtcars, times = 1000) # 修正后的拟合函数:显式提取数据 fit <- \(d) tidy(lm(mpg ~ wt, data = analysis(d))) # 使用future_map并行执行 splits$estimates <- future_map(splits$splits, fit) # 或者用future_lapply # splits$estimates <- future_lapply(splits$splits, fit) # 汇总Bootstrap结果 int_pctl(splits, estimates)
补充说明
- 顺序执行和
mclapply无需额外处理,是因为它们的执行上下文能直接访问mtcars原始数据,rsplit的索引可以直接对应到原始数据行。 multisession的每个子进程是独立的,没有父进程的原始数据环境,必须通过analysis()把rsplit里的训练数据提取出来,才能让lm正确读取数据进行拟合。
内容的提问来源于stack exchange,提问作者Vincent
相关产品推荐
相关产品推荐

