2013-07-03 38 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一些很好的例子。