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
相关产品推荐
相关产品推荐

