正确的点()在带有for循环的多重映射中使用

时间:2017-09-10 20:19:11

标签: r loops for-loop points

我想制作几张地图(我的数据集的每种物种都有一张),但不知怎的,我无法达到我想要的效果。

我想在其地图中绘制每个物种的记录,但我只为每一个创建一个带有一个点的地图......我无法理解我的脚本有什么问题。你可以帮帮我吗?谢谢!

elevation <- getData("alt", country = "ES", mask=F)
slope <- terrain(elevation, opt = "slope",neighbors=4) 
aspect <- terrain(elevation, opt = "aspect",neighbors=4)
hill <- hillShade(slope, aspect, 40, 270)
newextent<-extent(-7.99, -2.87, 39.9, 41.5)
land.pal <- colorRampPalette(c("#336600", "#F3CA89", "#D9A627", 
                               "#A49019", "#9F7B0D", "#996600", "#B27676", "#C2B0B0", "#E5E5E5", 
                               "#FFFFFF"), space="Lab") (1000)


for (i in seq_along(data$Species)) {
  pdf(file=paste0("map ", data$Species[[i]],".pdf"), onefile=F)
  plot(disaggregate(crop(elevation,newextent), 1, method="bilinear"), col = land.pal, legend=F)  
  points(data$Lat[[i]],data$Long[[i]], col="black") ##The error must be here, but I cannot fix it
  dev.off()
}

提前谢谢

数据:

Lat Long    Species
-6.99   40.49   Sp1
-5.05   40.60   Sp1
-3.30   40.02   Sp1
-7.51   40.86   Sp1
-3.18   40.24   Sp1
-3.83   40.08   Sp1
-7.28   40.91   Sp1
-7.74   40.53   Sp1
-7.72   40.69   Sp1
-4.36   40.06   Sp1
-5.90   40.51   Sp2
-5.56   40.07   Sp2
-3.52   40.19   Sp3
-6.29   40.93   Sp3
-6.77   40.12   Sp3
-7.11   40.77   Sp4
-5.81   40.88   Sp4
-5.27   40.68   Sp4
-6.31   40.34   Sp4
-6.13   40.32   Sp4
-6.73   40.99   Sp4
-5.32   40.71   Sp4
-6.17   40.97   Sp4
-4.77   40.92   Sp4
-6.45   40.58   Sp5
-5.54   40.39   Sp5
-6.56   40.66   Sp5
-5.27   40.37   Sp5

1 个答案:

答案 0 :(得分:0)

目前,您正在遍历 Species 列的每个值,而不是 Species 作为整个组,并且您传递了一个 Lat Long ,因此在for循环中传递了一行。

因此,请考虑by Species 因子对数据帧进行切片,迭代地将每个切片数据帧传递到函数中。下面没有显示但是by可以返回一个命名的对象列表,其中的对象分组等于 Species

by(data, data$Species, FUN = function(df) {
  pdf(file=paste0("map ", df$Species[[1]],".pdf"), onefile=FALSE)
  plot(disaggregate(crop(elevation,newextent), 1, method="bilinear"), col = land.pal, legend=FALSE)  
  points(df$Lat, df$Long, col="black")
  dev.off()
})