R语言循环中用paste0/get/eval为列表内数据框命名失败求助
解决R语言中动态生成列表的命名问题
问题原因
你遇到的报错是因为get()或eval(parse(...))返回的是对象的临时副本,对副本的修改不会影响原对象,R不允许对临时值进行赋值操作,因此会提示“target of assignment expands to non-language object”。
解决方案
方法1:生成列表时直接命名(推荐)
在创建列表的同时就设置好名称,避免后续修改的麻烦:
library(stringr) num_fu = c('1','2','3','4','5','6','7','8','9') for (i in num_fu){ # 获取当前文件夹下的CSV文件路径 flnames <- list.files(path = paste0("C:/Users/thepr/Documents/data/as", i), pattern = "\\.csv", full.names = TRUE) # 生成名称向量(去掉.csv后缀并截取前6位) nm <- gsub(".csv", "", basename(flnames)) %>% str_sub(1, 6) # 读取文件并创建列表,直接设置名称 as_list <- lapply(flnames, function(x) base::as.data.frame(read.csv(x))) names(as_list) <- nm # 将命名后的列表存入全局环境 assign(paste0("as", i, "_list"), as_list) # 可选:保存文件路径列表 assign(paste0("flnames", i), flnames) }
方法2:修改已生成的列表
如果已经创建了未命名的列表,可以先取出列表、修改名称后重新赋值回去:
library(stringr) num_fu = c('1','2','3','4','5','6','7','8','9') for (i in num_fu){ # 获取已有的列表对象 current_list <- get(paste0("as", i, "_list")) # 获取对应的文件路径列表 flnames <- get(paste0("flnames", i)) # 生成名称向量 nm <- gsub(".csv", "", basename(flnames)) %>% str_sub(1, 6) # 修改列表名称 names(current_list) <- nm # 将修改后的列表重新赋值回全局环境 assign(paste0("as", i, "_list"), current_list) }
更优写法:避免使用assign/get
频繁用assign和get会让代码可读性变差,建议用一个大列表统一存储所有结果:
library(stringr) num_fu = c('1','2','3','4','5','6','7','8','9') all_data <- list() for (i in num_fu){ flnames <- list.files(path = paste0("C:/Users/thepr/Documents/data/as", i), pattern = "\\.csv", full.names = TRUE) nm <- gsub(".csv", "", basename(flnames)) %>% str_sub(1, 6) as_list <- lapply(flnames, function(x) base::as.data.frame(read.csv(x))) names(as_list) <- nm # 将结果存入大列表 all_data[[paste0("as", i, "_list")]] <- as_list } # 访问示例:获取as1_list all_data[["as1_list"]]
内容的提问来源于stack exchange,提问作者HJ WHY
相关产品推荐
相关产品推荐

