R语言嵌套for循环中如何获取字符列表对应变量名字符串生成文件名
问题描述
你持有多个独立的字符向量,首先将这些向量存入了一个列表对象,初始代码如下:
C1 <- c('a', 'b', 'c') C2 <- c('d', 'e', 'f') C3 <- c('g', 'h', 'i') char_list <- list(C1, C2, C3)
你需要通过嵌套循环批量生成FeaturePlot并导出为图片,期望的文件名格式为C1_a.png、C1_b.png、C1_c.png、C2_d.png、C2_e.png、C2_f.png,即文件名前缀为向量对应的原始变量名,后缀为向量内的特征名。
你最初编写的循环代码运行后文件名不符合预期,前缀变成了对应向量的首个元素,生成的是a_a.png、a_b.png、d_d.png这类错误命名的文件,错误代码如下:
for(c in char_list){ for(g in c){ png(paste0(c, '_', g, ".png")) plot(FeaturePlot(object = MG_Subset1, reduction = "umap", label = TRUE, min.cutoff = 0, features = g)) dev.off() } }
问题原因
创建char_list时没有给列表元素设置命名,循环遍历列表时拿到的迭代对象是向量本身,而非向量对应的原始变量名,因此paste0(c, '_', g)会直接将向量内容与元素拼接,最终文件名前缀变成向量的首元素。
解决方案
不需要改动原有循环的核心绘图逻辑,只需要做两处调整:
- 创建列表时给元素绑定对应变量名作为列表的命名属性
- 外层循环遍历列表的名称,同步取到对应的向量内容传入内层循环,不改变内层循环的遍历逻辑
修改后的完整可运行代码:
# 构建带命名的列表,元素名即为需要的文件名前缀 char_list <- list( C1 = C1, C2 = C2, C3 = C3 ) # 外层遍历列表名,内层遍历向量元素,核心绘图逻辑完全不变 for(vec_name in names(char_list)){ current_vec <- char_list[[vec_name]] for(g in current_vec){ png(paste0(vec_name, '_', g, ".png")) plot(FeaturePlot(object = MG_Subset1, reduction = "umap", label = TRUE, min.cutoff = 0, features = g)) dev.off() } }
提示:不建议用
c作为自定义变量名,c()是R语言内置的基础向量拼接函数,占用函数名做变量容易引发隐蔽的运行错误。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

