R语言自定义sizeReport函数无法加载文件信息至数据框问题
函数返回空数据框的常见问题排查
由于你没贴出具体代码,结合需求和现象,列出几个最可能的问题:
1. 路径未取完整路径
调用list.files()时如果没加full.names = TRUE,拿到的是相对当前工作目录的短文件名,后续用file.size()或file.info()时会找不到对应文件,返回NA,最后可能被过滤掉导致空数据框。
2. 递归深度参数未正确传递
你的函数有level参数,但如果在list.files()里没正确设置recursive和level(比如R版本低于4.0的话list.files没有level参数,得自己处理递归层数),会导致没遍历到目标文件/目录。
3. 过滤逻辑出错
dironly = TRUE时,可能没正确筛选目录,比如没用到file.info()$isdir判断;patt正则规则写得太严格,匹配不到任何内容,比如误写了特殊字符没转义。
4. 文件/目录大小计算错误
- 直接用
file.size()计算目录大小会返回NA,要是没处理这些NA值,构建dataframe后可能被na.omit()之类的操作清空; - 遇到权限不足的文件,
file.size()也会返回NA,同样可能导致结果为空。
5. 返回逻辑有问题
函数最后可能没正确返回构建好的dataframe,或者某个分支里返回了空对象。
参考实现示例
sizeReport <- function(path, patt = ".*", dironly = FALSE, level = Inf) { # 获取带完整路径的文件/目录列表 file_list <- list.files( path = path, pattern = patt, full.names = TRUE, recursive = is.infinite(level) || level > 0, level = if(is.infinite(level)) NULL else level ) # 筛选仅目录 if (dironly) { file_list <- file_list[file.info(file_list)$isdir] } # 计算大小:目录用fs包的dir_size,文件用file.size get_size <- function(x) { if (file.info(x)$isdir) { if (requireNamespace("fs", quietly = TRUE)) { fs::dir_size(x) } else { NA_real_ # 无fs包时目录大小返回NA } } else { file.size(x) } } sizes <- sapply(file_list, get_size) # 构建结果数据框 data.frame( path = file_list, size_bytes = sizes, stringsAsFactors = FALSE ) }
内容的提问来源于stack exchange,提问作者Radeq2137
相关产品推荐
相关产品推荐

