R语言如何将列表采样的lapply转换为foreach %dopar%并行写法
代码错误原因与正确改写方案
错误根因
你编写的并行代码存在两个核心问题:
- 循环变量
k是嵌套列表pind的索引值,直接对k执行采样仅会对单个数字做操作,完全没有访问pind中存储的实际列表元素 .combine = 'c'会把所有返回结果拼接为一个长向量,丢失原lapply返回的嵌套列表结构
正确改写方式
方案1:foreach改写(保持与原lapply输出结构完全一致)
test <- foreach::foreach(k = seq_along(pind), .combine = 'list', .multicombine = TRUE) %dopar% { sample(pind[[k]], length(pind[[k]])) }
补充说明:
- 用
seq_along(pind)替代seq_len(length(pind))鲁棒性更强,当pind为空时不会报错 - 如果你确实需要把所有采样后的子向量拼接为单个长向量,再将
.combine参数改回'c'即可 - 原代码中的
sample(x, length(x))可以简化为sample(x),sample函数默认的采样大小就是输入向量的长度
方案2:Bioconductor规范适配方案(更推荐)
Bioconductor生态更推荐使用官方并行框架BiocParallel,无需手动处理循环索引,写法和原lapply几乎一致,更符合打包规范:
test <- BiocParallel::bplapply(pind, function(x) sample(x, length(x)))
使用该方案仅需在DESCRIPTION文件中声明BiocParallel依赖,并行后端可由用户根据运行环境自行配置,适配性更强。
内容的提问来源于stack exchange,提问作者ZheFrench
相关产品推荐
相关产品推荐

