R语言:如何用lapply或for循环转换绘图嵌套列表结构?
问题描述
我有4个绘图列表(每个列表包含8个绘图),这些列表被整合为一个嵌套列表(即由4个子列表组成的列表,每个子列表含8个绘图)。现在需要得到8个输出列表,每个输出列表由原4个子列表的对应位置元素构成(例如第一个输出列表包含4个子列表的第1个元素)。
我尝试了以下代码,但输出结果为NULL:
PlotsA <- list(Plot1.png, Plot2.png,..., Plot8.png) PlotsB <- list(Plot9.png, Plot10.png,..., Plot16.png) PlotsC <- list(Plot17.png, Plot18.png,..., Plot24.png) PlotsD <- list(Plot25.png, Plot26.png,..., Plot32.png) All_Plots <- list(PlotsA, PlotsB, PlotsC, PlotsD) ABC <- for (i in seq_along(All_Plots)){ for (j in length(All_Plots[[i]])){ x = list(All_Plots[[i]][j]) x } } ABC
期望的输出结果如下:
Outcome1 [1] Plot1.png, Plot9.png, Plot17.png, Plot25.png Outcome2 [2] Plot2.png, Plot10.png, Plot18.png, Plot26.png ...
后续会将每个输出列表中的4个绘图组合成绘图网格,希望能用lapply或for循环完成该列表转换需求。
解决方案
你的原代码问题出在:
for循环里直接赋值x但没有收集结果,R的for循环默认返回NULLj in length(All_Plots[[i]])只会取到一个值(8),应该用seq_along(All_Plots[[i]])遍历每个位置
下面提供两种可行的实现方式:
方法1:使用lapply(更简洁)
利用lapply遍历目标位置(1到8),每个位置上提取所有子列表对应位置的元素:
# 先构造示例数据(替换成你实际的绘图对象) PlotsA <- list("Plot1.png", "Plot2.png", "Plot3.png", "Plot4.png", "Plot5.png", "Plot6.png", "Plot7.png", "Plot8.png") PlotsB <- list("Plot9.png", "Plot10.png", "Plot11.png", "Plot12.png", "Plot13.png", "Plot14.png", "Plot15.png", "Plot16.png") PlotsC <- list("Plot17.png", "Plot18.png", "Plot19.png", "Plot20.png", "Plot21.png", "Plot22.png", "Plot23.png", "Plot24.png") PlotsD <- list("Plot25.png", "Plot26.png", "Plot27.png", "Plot28.png", "Plot29.png", "Plot30.png", "Plot31.png", "Plot32.png") All_Plots <- list(PlotsA, PlotsB, PlotsC, PlotsD) # 生成目标列表 result <- lapply(seq_along(All_Plots[[1]]), function(pos) { lapply(All_Plots, function(sub_list) sub_list[[pos]]) }) # 给结果命名(可选) names(result) <- paste0("Outcome", seq_along(result)) result
方法2:使用for循环(手动收集结果)
初始化一个空列表,然后在循环中逐个位置收集对应元素:
# 构造示例数据(替换成实际绘图) PlotsA <- list("Plot1.png", "Plot2.png",..., "Plot8.png") PlotsB <- list("Plot9.png", "Plot10.png",..., "Plot16.png") PlotsC <- list("Plot17.png", "Plot18.png",..., "Plot24.png") PlotsD <- list("Plot25.png", "Plot26.png",..., "Plot32.png") All_Plots <- list(PlotsA, PlotsB, PlotsC, PlotsD) # 初始化空列表存储结果 result <- vector("list", length(All_Plots[[1]])) names(result) <- paste0("Outcome", seq_along(result)) # 遍历每个目标位置 for (j in seq_along(All_Plots[[1]])) { temp <- list() # 遍历每个子列表,提取对应位置的元素 for (i in seq_along(All_Plots)) { temp[[i]] <- All_Plots[[i]][[j]] } result[[j]] <- temp } # 查看结果 result
两种方法得到的result都是包含8个子列表的列表,每个子列表对应原4个列表的同位置元素,正好满足后续组合绘图网格的需求。
内容的提问来源于stack exchange,提问作者Samarth
相关产品推荐
相关产品推荐

