如何用tidyverse风格从Zip包读取Shapefile且不生成可见解压文件?
问题:无可见解压文件,用tidyverse风格读取多Zip包中的Shapefile
需要实现不生成Windows资源管理器可见的解压文件,同时采用tidyverse风格(管道操作、不保存中间对象)从多个Zip压缩包中读取Shapefile。现有代码无法运行,需排查原因并修正。可使用美国城市边界的Shapefile Zip包测试(取2个文件简化验证即可)。
用户尝试的代码:
library(tidyverse) library(magrittr) library(sf) list.files() %>% map(unzip, list = T) %>% map(filter, grepl(".shp$", Name)) %>% map(~ .x %$% Name) %>% map2(.x = ., .y = list.files(), .f = ~st_read(unzip(zipfile = .y, files = .x)))
代码无法运行的核心原因
仅处理Shapefile的单个.shp文件
Shapefile是由.shp、.shx、.dbf等多个关联文件组成的格式,你的代码只过滤并解压了.shp文件,st_read()读取时会因缺少配套的索引、属性文件而报错。解压到当前工作目录
默认unzip()会将文件解压到当前工作目录,这会生成Windows资源管理器可见的文件,不符合你“无可见解压文件”的需求。未正确处理临时文件路径
st_read()需要明确的文件路径,而你的代码中unzip()仅返回文件名,未指定临时存储位置,导致读取逻辑混乱。
修正后的tidyverse风格代码
library(tidyverse) library(sf) library(withr) # 筛选当前目录下的zip文件 list.files(pattern = "\\.zip$", full.names = TRUE) %>% map(function(zip_path) { # 创建临时目录,函数结束后自动清理 withr::local_tempdir() %>% { # 解压当前zip包中所有Shapefile必要配套文件到临时目录 unzip(zipfile = zip_path, files = unzip(zip_path, list = TRUE) %>% filter(str_detect(Name, "\\.(shp|shx|dbf|prj)$")) %>% pull(Name), exdir = .) # 从临时目录读取Shapefile(默认每个zip对应一个shp文件) list.files(., pattern = "\\.shp$", full.names = TRUE) %>% first() %>% st_read() } }) %>% # 按需合并所有读取的空间对象 bind_rows()
代码说明
- 用
withr::local_tempdir()创建自动清理的临时目录,解压文件仅存在于临时空间,Windows资源管理器无法直接看到。 - 筛选并解压Shapefile全部必要配套文件,确保
st_read()能正常解析空间数据。 - 全程使用管道串联逻辑,无中间对象保存,完全符合tidyverse风格。
内容的提问来源于stack exchange,提问作者J. Doe
相关产品推荐
相关产品推荐

