我正在尝试制作一个12个生态区的图,这些生态区作为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有没有人对如何解决这个问题有什么建议?
提前感谢!
发布于 2013-07-03 11:04:13
我不确定在这种情况下循环是否是最佳实践,但我认为在当前代码中使用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]]))发布于 2013-07-03 11:08:43
在本例中,您不想使用as.name,但我认为您正在寻找类似于get的东西。所以,只要用ER=get(Ecoregions[i])替换ER=as.name(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上查找一些很好的例子。
https://stackoverflow.com/questions/17438816
复制相似问题