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

R读取在线zip压缩包内文件时先读取的数据集异常损坏问题

问题成因
  • unzip() 默认将文件解压至当前工作目录,两次调用函数时解压的routes.txt为同名文件,第二次解压的内容会直接覆盖第一次解压生成的本地文件。
  • readr::read_delim() 默认启用*延迟加载(lazy loading)*机制,返回的tibble不会一次性将全量数据加载到内存,仅保存源文件的路径引用,仅当你实际访问数据时才会读取本地文件内容。

你首次生成test_1时仅保存了第一次解压的routes.txt的路径引用,第二次调用函数覆盖了该本地文件后,后续再访问test_1时会读取已被覆盖的新文件内容,因此出现数据错乱的问题。

解决方法

两种可行方案任选其一即可:

方案1:关闭延迟加载(最简单)

给read_delim()添加lazy = FALSE参数,读取数据时直接将全量内容加载到内存,后续不再依赖本地源文件:

f_get_data <- function(i, data){
  url <- tt_url[i]
  zip_file <- tempfile(fileext = ".zip")
  download.file(url, zip_file, mode = "wb")
  # 新增lazy = FALSE参数
  df <- read_delim(unzip(zip_file, files = data), delim = ",", lazy = FALSE) %>%
    mutate(year = i + 2015)
  return(df)
}

方案2:解压到独立临时目录避免文件覆盖

每次解压时指定独立的临时文件夹作为输出路径,不会出现同名文件覆盖的问题:

f_get_data <- function(i, data){
  url <- tt_url[i]
  zip_file <- tempfile(fileext = ".zip")
  temp_dir <- tempdir() # 生成独立临时目录
  download.file(url, zip_file, mode = "wb")
  # 指定解压到临时目录
  unzip(zip_file, files = data, exdir = temp_dir)
  df <- read_delim(file.path(temp_dir, data), delim = ",") %>%
    mutate(year = i + 2015)
  return(df)
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 16:18:01