如何提升R语言foreach嵌套循环输出结果列表的可读性
R语言foreach嵌套循环输出命名优化方案
你需要给外层foreach添加.names = TRUE参数,即可让返回列表的结构和普通嵌套for循环完全一致,支持按名称索引访问:
library(foreach) library(doFuture) registerDoFuture() plan(multicore, workers = 1) # 优化后的foreach循环,添加.names参数命名外层列表 res <- foreach(a = c("A", "B", "C", "D"), .names = TRUE) %:% foreach(b = 1:4) %do% { paste0(rep(a, b)) } # 验证和for循环输出结果完全一致 res_desired <- list() for(a in c("A", "B", "C", "D")) { for(b in 1:4) { res_desired[[a]][[b]] <- paste0(rep(a, b)) } } identical(res, res_desired) # 运行返回TRUE
说明
.names = TRUE是foreach内置参数,开启后会自动将每次外层迭代对应的a的取值,设为外层返回列表的元素名- 内层
foreach默认返回按迭代顺序排列的列表,索引从1到4,和你原for循环的[[b]]数值索引完全对应 - 调整后你可以直接用
res[["B"]][[3]]访问对应元素,和res_desired的使用方式没有任何区别
如果需要内层列表也支持按名称访问,可以给内层foreach也加上.names = TRUE参数:
res <- foreach(a = c("A", "B", "C", "D"), .names = TRUE) %:% foreach(b = 1:4, .names = TRUE) %do% { paste0(rep(a, b)) } # 此时支持两种访问方式 res[["B"]][[3]] # 数值索引 res[["B"]][["3"]] # 字符名称索引
内容的提问来源于stack exchange,提问作者SiH
相关产品推荐
相关产品推荐

