R语言如何通过变量在for循环中调用指定表格及对应列绘图
你遇到的问题核心是:拼接生成的name2是字符串格式,并非环境中已加载的数据框对象,因此无法直接通过$符读取列值。
方案1:最小改动适配现有代码
使用R内置的get()函数,将字符串形式的变量名转换为对应的实际对象,仅需修改geom_vline行的参数即可,修改后完整循环代码如下:
table_1 <- read.table("sometable1") table_2 <- read.table("sometable2") table_n <- read.table("sometablen") a=1 for(f in args) { L <- sub("#", "", readLines(f)) df <- read.table(text = L, header = TRUE) name <- gsub(".txt", "", f) name2 <- paste("table_", a, sep="") jpeg(paste(name, ".jpg", sep="")) # 仅修改此行,用get()获取对应数据框 ggplot(df, aes(x=POS, y=Pperbase)) + geom_point() + geom_vline(xintercept= get(name2)$start, color = "purple", alpha = .05) dev.off() a=a + 1 }
方案2:更规范的列表存储方案(推荐)
避免在全局环境生成大量零散的table_*变量,初始化时就将所有预加载的表格存入列表,后续循环通过索引取值更稳定,不会出现环境变量查找异常:
# 初始化列表存储所有预加载表格 table_list <- list( read.table("sometable1"), read.table("sometable2"), # 其他表格可批量读取后依次存入 read.table("sometablen") ) a=1 for(f in args) { L <- sub("#", "", readLines(f)) df <- read.table(text = L, header = TRUE) name <- gsub(".txt", "", f) jpeg(paste(name, ".jpg", sep="")) # 直接通过列表索引取对应表格的start列 ggplot(df, aes(x=POS, y=Pperbase)) + geom_point() + geom_vline(xintercept= table_list[[a]]$start, color = "purple", alpha = .05) dev.off() a=a + 1 }
内容的提问来源于stack exchange,提问作者Eric González
相关产品推荐
相关产品推荐

