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

R循环绑定JSON数据报Can't recycle错误如何定位问题文件

循环绑定JSON数据报错定位方案

报错场景

执行批量读取JSON文件并按行合并的循环代码时,触发vctrs包长度回收错误:

Error in vctrs::data_frame(): ! Can't recycle users (size 117) to match places (size 3). Run rlang::last_error() to see where the error occurred.

原有执行代码如下:

filesU <- list.files("C:/Users/artde/OneDrive/Documents/Master R/Master R/Project 1/Json/Daran_API_U/")

tweetsU = fromJSON("C:/Users/artde/OneDrive/Documents/Master R/Master R/Project 1/Json/Daran_API_U/users_1344795476151971842.json", flatten=T)

filesU <- filesU[-1] 

for (file in 1:length(filesU)) { 
    tweetsU_loop = fromJSON(paste0("C:/Users/artde/OneDrive/Documents/Master R/Master R/Project 1/Json/Daran_API_U/", 
                                   filesU[file])) 
    tweetsU = bind_rows(tweetsU,tweetsU_loop) 
}

已知同逻辑处理其他数据集可正常运行,判断为部分JSON文件解析后的数据结构、字段长度和其余文件不匹配。因待处理文件共640个,无明显文件名、文件大小异常,需要可快速定位问题文件的方法。

定位方法

方法1:循环内加错误捕获,直接输出触发报错的文件

用tryCatch包裹行绑定步骤,一旦触发报错就直接打印当前处理的文件名、报错信息,同时可选择跳过问题文件继续遍历剩余文件,无需手动逐个测试。
改造后的可定位代码如下:

library(jsonlite)
library(dplyr)

# 定义文件目录,开启full.names参数直接获取完整路径,避免手动拼接路径出错
file_dir <- "C:/Users/artde/OneDrive/Documents/Master R/Master R/Project 1/Json/Daran_API_U/"
filesU <- list.files(file_dir, full.names = TRUE, pattern = "\\.json$")

# 初始化存储对象
problem_files <- c()
tweetsU <- fromJSON(filesU[1], flatten = TRUE)

# 从第二个文件开始遍历
for (i in 2:length(filesU)) {
  current_path <- filesU[i]
  # 打印当前处理进度
  cat("Processing:", i, "/", length(filesU), basename(current_path), "\n")
  
  current_data <- fromJSON(current_path, flatten = TRUE)
  # 捕获绑定环节的错误
  tryCatch({
    tweetsU <- bind_rows(tweetsU, current_data)
  }, error = function(e) {
    # 输出问题文件名和对应报错信息
    cat("❌ Error in file:", basename(current_path), "\nMsg:", e$message, "\n")
    # 将问题文件存入向量,遍历结束后可直接查看
    problem_files <<- c(problem_files, current_path)
  })
}

# 遍历完成后输出所有问题文件清单
cat("All problem files:\n")
print(problem_files)

方法2:预校验所有文件结构,提前标记不一致文件

报错本质是不同JSON文件解析后,列名、嵌套字段长度、子表结构不匹配,可在绑定前先做结构校验,不用等到绑定环节触发报错才定位。以第一个正常读取的文件为结构基准,逐个比对剩余文件的列数、列名、嵌套列长度,直接标记结构不符合的文件:

# 以第一个文件为结构基准
base_col <- colnames(tweetsU)
base_ncol <- ncol(tweetsU)

for (i in 2:length(filesU)) {
  current_path <- filesU[i]
  current_data <- fromJSON(current_path, flatten = TRUE)
  
  # 校验列数、列名一致性
  if (ncol(current_data) != base_ncol | !all(colnames(current_data) %in% base_col)) {
    cat("Structure mismatch (columns):", basename(current_path), "\n")
    problem_files <<- c(problem_files, current_path)
    next
  }
  
  # 校验列表型嵌套列(如users、places)的长度是否与主表行数匹配
  list_cols <- names(which(sapply(current_data, is.list)))
  for (col in list_cols) {
    if (length(current_data[[col]]) != nrow(current_data)) {
      cat("Length mismatch in column", col, "of file:", basename(current_path), "\n")
      problem_files <<- c(problem_files, current_path)
      break
    }
  }
}

后续处理

定位到问题文件后,单独读取对应文件查看结构差异,对缺失字段补空值、对嵌套结构做统一扁平化处理后,再重新执行合并即可。

内容的提问来源于stack exchange,提问作者Daworn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 21:27:46