2013-07-03 37 views
1

我試圖繪製12個ecoregions作爲shapefile的圖。 作爲一個例子:繪製shapefile中的循環錯誤

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 

有沒有人對如何解決這個問題有什麼建議?

在此先感謝!

回答

3

我不確定循環是否是這種情況下的最佳做法,但在當前代碼中使用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) 

,讓您再使用lapplysapply像這樣應用功能,每個組件:

lapply(Ecoregions,function(x) plot(x[[1]])) 
3

在這種情況下,您不想使用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) 

如果你想獲得更豐富的,雖然,你想使所有地區的情節在網格中,你可以使用latticeggplot。嘗試查找ggmap一些很好的例子。