You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 12:01:08