Построение шейп-файла Ошибка в циклах

Я пытаюсь сделать график из 12 экорегионов, которые представлены в виде шейп-файлов. Например:

ER_10.2<-Level.2.ecoregs[Level.2.ecoregs$NA_L2CODE=="10.2",]
> ER_10.2
class       : SpatialPolygonsDataFrame 
nfeatures   : 26 
extent      : -1693158, 44930.55, -2591002, -691719.8  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=laea +lat_0=45 +lon_0=-100 +x_0=0 +y_0=0 +a=6370997 +b=6370997 +units=m +no_defs 
nvariables  : 8
names       : NA_L2CODE,    NA_L2NAME, NA_L1CODE,              NA_L1NAME,           NA_L2KEY,                   NA_L1KEY,  Shape_Leng,   Shape_Area 
min values  :      10.2, WARM DESERTS,        10, NORTH AMERICAN DESERTS, 10.2  WARM DESERTS, 10  NORTH AMERICAN DESERTS,    11613.69,      8382714 
max values  :      10.2, WARM DESERTS,        10, NORTH AMERICAN DESERTS, 10.2  WARM DESERTS, 10  NORTH AMERICAN DESERTS, 11456404.58, 510159399963 

Мне нужно сделать это в цикле, потому что я также включаю дополнительные анализы.

Ecoregions.list <- c("ER_10.2", "ER_12.1", "ER_14.3","ER_13.2",
  "ER_09.6", "ER_09.5", "ER_14.1", "ER_13.3", "ER_09.4", "ER_08.3", "ER_13.1", "ER_11.1")

Ecoregions<-unique(as.character(Ecoregions.list))

for(i in 1:length(Ecoregions))
    {
    Ecoregions<-unique(as.character(Ecoregions.list))
    ER=as.name(Ecoregions[i])
    plot (ER)
    }

Но когда я пытаюсь прочитать рисунок, чтобы построить его, я всегда получаю эту ошибку:

Error in xy.coords(x, y, xlabel, ylabel, log) : invalid first argument

Есть ли у кого-нибудь предложения о том, как решить эту проблему?

Заранее спасибо!


person I Del Toro    schedule 03.07.2013    source источник


Ответы (2)


Я не уверен, что цикл является лучшей практикой в ​​​​этой ситуации, но использование as.name в вашем текущем коде, я полагаю, вызывает у вас огорчение.

Также нет необходимости зацикливаться на 1:length(x), оператор for будет просто итеративно проходить каждый элемент вектора, такого как Ecoregions, без явного указания сделать это.

Вместо этого попробуйте что-то вроде этого упрощенного примера, используя get:

ER_10.2 <- data.frame(v1=1:10)
ER_12.1 <- data.frame(v1=2:11)
Ecoregions.list <- c("ER_10.2", "ER_12.1")
Ecoregions <- unique(Ecoregions.list)

for(i in Ecoregions) {
    ER <- get(i)[[1]]
    # add the below line if you want 12 separate plots
    # dev.new() 
    plot(ER)
    # insert other code here which would presumably negate
    # your ability to use the 'lapply' function.
}

Я должен дополнительно отметить, что в R обычно не рекомендуется использовать такие функции, как get и текстовые строки для представления имен данных. Обычно, если у вас есть много связанных data.frames или других объектов, вы должны объединить их в list, например:

Ecoregions <- list(ER_10.2, ER_12.1)

Что позволяет вам затем применять функции к каждому компоненту, используя lapply или sapply, например:

lapply(Ecoregions,function(x) plot(x[[1]]))
person thelatemail    schedule 03.07.2013

В этом случае вы не хотите использовать as.name, но я думаю, что вы ищете что-то вроде get. Итак, просто замените ER=as.name(Ecoregions[i]) на ER=get(Ecoregions[i]), и все должно работать.

Но это не очень хороший способ справиться с этой ситуацией. Вместо создания новой переменной для каждого из ваших регионов вы можете создать list регионов. Таким образом, вы перебираете элементы list, а не имена переменных.

Например, вместо ER_10.2<-Level.2.ecoregs[Level.2.ecoregs$NA_L2CODE=="10.2",] попробуйте сделать что-то вроде:

# Split your regions by the L2 Code.
list.of.regions<-split(Level.2.ecoregs,Level.2.ecoregs$NA_L2CODE)

Теперь, если ваши данные изменятся (например, если будет добавлен новый NA_L2CODE), вам не придется менять свой код, потому что это будет новый элемент вашего списка.

Теперь вы можете перебрать элементы вашего списка:

# Loop over each element of the list.
for (region in list.of.regions) 
    plot(region)

И, если вы хотите пофантазировать, вы можете использовать lapply, который просто запускает функцию для каждого элемента list.

lapply(list.of.regions,plot)

Однако, если вы хотите стать еще более изощренным и хотите построить график всех регионов в сетке, вы можете использовать lattice или ggplot. Попробуйте найти ggmap несколько хороших примеров.

person nograpes    schedule 03.07.2013