在执行任务时循环访问文件夹

时间:2013-12-11 04:10:45

标签: r for-loop directory shapefile listdir

我正在尝试遍历目录中的文件夹,同时阅读并将文件分配给R中的变量。我知道在这个主题上已经有很多线程了。但是,我无法找到解决问题的方法。我是R的新人,请跟我一起裸露。

我想要分配给变量的文件是shapefiles,所以我使用readOGR包中的函数rgdal。目的是稍后合并属于特定物种的所有shapefile。目录的层次结构/结构是type1> species> idsshapefiles看起来像id.shp等。

示例shapefile可以下载herehere

#code
setwd("~/type1/")

#Extract ids belonging to $species. Later use in readOCR function

sp_id <- function(species){
 wd = "~/type1/"
 list_shp <- list.files(path=paste(wd,species,sep='/'), full.names = F, recursive = F, include.dirs = F)
 vec <- character() 

  for (shp in list_shp){
   y <- unlist(strsplit(shp, '\\.', perl=T))
   vec <- unique(c(vec,y[1]))
  }

 #"1905" "4279"

#Extract dirs for where to perform readOCR function

  list_dir <- list.dirs(path=paste(wd,species,sep='/'), full.names = F, recursive = F)

   for (id in list_dir){
    setwd(id)
    print(getwd())
   }

#"~/type1/speciesX1/1905"
#"~/type1/speciesX1/4279"

    for (i in vec){
     assign(paste("", i, sep=""), readOGR(".", i))
    break
    }
 }

sp_id('speciesX1')

[1] "~/type1/speciesX1/1905"
OGR data source with driver: ESRI Shapefile 
Source: ".", layer: "1905"
with 10 features and 3 fields
Feature type: wkbPolygon with 2 dimensions
[1] "~/type1/speciesX1/4279"
Error in ogrInfo(dsn = dsn, layer = layer, encoding = encoding, use_iconv = use_iconv) : 
Cannot open layer

问题是代码只对readOGR中的一个shapefile执行dirs,似乎再次更改目录但不执行最后一个readOGR

任何指针都将受到高度赞赏。

2 个答案:

答案 0 :(得分:2)

您的功能似乎在许多不同的部分被打破,但您可以这样做:

library(rgdal)

setwd("~/type1/")
species <- 'speciesX1'
list_shp <- list.files(path=species, pattern="*.shp", full.names = TRUE,
                       recursive = TRUE, include.dirs = FALSE)
shp_objects <- lapply(list_shp, function(x) {readOGR(dsn=x, 
                                                     layer=ogrListLayers(x))})

这将为您提供可以合并的SpatialPolygonDataframe个对象列表。

答案 1 :(得分:0)

我无法让ogrInfo()读取缺少图层错误的文件。这提供了一种读取和获取某些属性的方法。 (Mac将采用重复的目录名称并将“(n)”附加到它们,因此命名相同但不同的文件是iho.zip和iho.zip:

library(sp)

ca3 = readShapeSpatial("~/Downloads/iho/iho.shp")
ca3 = readShapeSpatial("~/Downloads/iho(2)/iho.shp")

> attributes(ca3)$data
                               name   id mrgid
0 Mediterranean Sea - Western Basin 28Aa  4279
1               Strait of Gibraltar  28a  3346
2                       Alboran Sea  28b  3324
3                      Balearic Sea  28c  3322
4                      Ligurian Sea  28d  3363
5                    Tyrrhenian Sea  28e  3386
> attributes(ca2)$data
                               name   id mrgid
0 Mediterranean Sea - Western Basin 28Aa  4279
1 Mediterranean Sea - Eastern Basin 28Bb  4280
2               Strait of Gibraltar  28a  3346
3                       Alboran Sea  28b  3324
4                      Balearic Sea  28c  3322
5                      Ligurian Sea  28d  3363
6                    Tyrrhenian Sea  28e  3386
7                      Adriatic Sea  28g  3314
8                        Ionian Sea  28f  3351
9                        Aegean Sea  28h  3315