перебирать папки во время выполнения задачи

Я пытаюсь перебирать папки в каталоге при чтении и назначении файлов переменным в R.

Переменным я хочу назначить файлы shapefiles, поэтому я использую функцию readOGR из пакета rgdal. Цель состоит в том, чтобы позже объединить все шейп-файлы, принадлежащие определенному виду. Иерархия / структура каталога: type1> species> ids. shapefiles выглядит как id.shp и т. Д.

Примеры шейп-файлов можно загрузить здесь и здесь

#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.


person jO.    schedule 11.12.2013    source источник


Ответы (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 объектов, которые вы затем можете объединить.

person jlehtoma    schedule 11.12.2013
comment
Отлично, спасибо! Не забывайте чаще использовать apply функции. На всякий случай, можете ли вы сказать мне, где моя функция не работает? - person jO.; 12.12.2013
comment
1. Имя вашей функции sp_id отличается от того, что вы вызываете позже (sp_mrgid('speciesX1')) 2. setwd(id) в строке 25 вызовет ошибку (насколько я видел, вы никогда не устанавливаете для wd значение species, к каким подпапкам вы пытаетесь получить доступ. Это было всего лишь быстрое наблюдение, не пытались всерьез отлаживать его. - person jlehtoma; 12.12.2013
comment
Вот суть, демонстрирующая слияние. - person jlehtoma; 12.12.2013
comment
Приветствую вас за комментарии и демонстрацию слияния. Ах да, название только опечатка при написании ветки. Я склонен менять имена из кода, который имеет очевидные недостатки. Другое, что вы упомянули, не является ошибкой, если я прав. list_dir <- list.dirs(path=paste(wd,species,sep='/'), full.names = F, recursive = F), где species (аргумент функции) - это подпапка. Это работает в коде, как я указал ... - person jO.; 12.12.2013

Я не мог заставить 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
person IRTFM    schedule 11.12.2013
comment
Приветствую вас за комментарии. Не могли бы вы объяснить, как это может помочь в описанной выше проблеме? - person jO.; 11.12.2013
comment
Что ж, я согласен с тем, что может быть проблема с вашим источником файлов shp. Трудно сказать, в чем на самом деле ваша ошибка. Я понял, что это не ваши настоящие файлы и вы не создали воспроизводимый пример. Если это фактические файлы, которые вы используете, а не легко доступные для иллюстрации, и никто не предлагает лучшего подхода, то, возможно, вы можете перейти в список рассылки R-SIG-GEO. - person IRTFM; 11.12.2013
comment
Ах хорошо. Я должен ogrInfo() работать, хотя ... например, ogrInfo(".", "1905") (переименовано, чтобы соответствовать mrgid) - person jO.; 11.12.2013
comment
Я бы подумал, что проблема в моей функции как таковой. Думаю, мне нужно next или break, чтобы перезапустить цикл (?) - person jO.; 11.12.2013