R语言按Excel文件内容删除文件时grepl判断失效问题排查
问题根因
你的代码核心bug出在if判断的入参不符合要求:R里的if()仅接受长度为1的逻辑值作为判断条件,你直接传入的grepl("^Prices", estimates_list[[i]][,1])返回值是和第一列行数等长的逻辑向量,这种情况下if只会默认取向量的第一个元素做判断——如果文件第一行第一列不是以"Prices"开头,哪怕后面任意行存在匹配项,都不会进入删除分支,这就是你遇到的部分文件匹配到规则但无法删除的原因。
除此之外原代码还有几个隐性问题:
- 循环过程中反复调用
list.files("."),如果中途删除文件,后续遍历的索引会和实际文件错位,容易读错、删错文件 - 预创建列表时长度按初始文件数固定,删除文件后列表会残留大量空的NULL元素,后续处理还要额外清理
- 用
[,1]取tibble格式的第一列时,返回结果仍是单列数据框而非向量,grepl处理数据框结构时可能出现非预期结果
修复后可直接运行的代码
library(readxl) # 一次性获取当前目录下所有xlsx文件的完整路径,避免循环中重复查询、索引错位 file_paths <- list.files(".", pattern = "\\.xlsx$", full.names = TRUE) estimates_list <- list() new_list <- list() for (path in file_paths) { current_df <- read_excel(path, col_names = FALSE) estimates_list[[path]] <- current_df # 核心修复:用any()聚合逻辑向量,只要第一列任意一行匹配规则就触发删除 if (any(grepl("^Prices", current_df[[1]]))) { file.remove(path) estimates_list[[path]] <- NULL # 可选:释放已读文件占用的内存 } else { new_list[[path]] <- test_function(current_df) } } # 不需要文件名作为列表名的话执行这行即可 # names(new_list) <- NULL
关键修改说明
- 提前一次性读取所有目标xlsx文件路径,加后缀过滤避免误读其他类型文件,开启
full.names防止工作目录变动导致文件找不到 - 判断条件外层嵌套
any(),只要第一列存在任意匹配^Prices的行就返回单个TRUE值,完全适配"Prices出现位置不固定"的需求 - 用
[[1]]直接提取第一列的向量值做匹配,避免数据框结构导致的grepl异常 - 用文件路径作为列表索引,不会因为中途删文件出现索引错位,也不会残留空列表元素
- 取消提前固定列表长度的写法,动态赋值更适配文件增删的场景
内容的提问来源于stack exchange,提问作者LoveMYMAth
相关产品推荐
相关产品推荐

