1

我想在 R 中实现一个函数,该函数能够增加 for 循环中缓冲区的大小。

总体计划是编写一个使用测试和参考形状文件的包。它应该在参考 shapefile 周围创建一个缓冲区,并根据需要增加大小,以与整个 test-shapefile 相交。

因此,我已经编写了一些代码片段来插入 shapefile 并创建第一个缓冲区:

require("rgeos")
require("rgdal")
l1=readOGR(dsn="C:/Maps", layer="osm_ms1")
l2=readOGR(dsn="C:/Maps", layer="osm_ms2")

proj4string(l2) = CRS("+init=epsg:31467")  ## DHDN / 3-degree Gauss-Kruger zone 3
l2buffer <- gBuffer(l2, width=0.001, capStyle="ROUND")

plot(l2buffer, col="black")
lines(l2, col="red")
lines(l1, col="blue")

到目前为止,一切正常。之后,我想将此方法转移到每个步骤都有一个缓冲区的 for 循环:

i = 0.001

buffergrow = function(shape) {
  for (k in 1:10) {
    linebuffer[k] <- gBuffer(l2, width=i, capStyle="ROUND")
    plot(linebuffer[k])
    i = i+0.001
  }  
}

> buffergrow(l2)
Error in linebuffer[k] <- gBuffer(shape, width = i, capStyle = "ROUND") : 
  Object 'linebuffer' not found

如您所见,当我以“l2”作为参数(形状)调用函数“buffergrow”时发生错误。有人知道为什么会这样吗?我已经尝试了其他一些想法,但我需要一些帮助。

可选/附加:关于我的总体计划的进一步工作,您对我有一些提示吗?

最好的问候,斯特凡

4

1 回答 1

4

您必须在访问其子元素之前初始化对象。例如:

foo <- double(10)
for (i in 1:10) {
  foo[i] <- i;
}
# or
linebuffer <- list()
for (i in 1:10) {
  linebuffer[[i]] <- i;
}

但是您的用例中不需要对象linebuffer。请尝试以下操作:

buffergrow = function(shape) {
  for (k in 1:10) {
    plot(gBuffer(l2, width=i, capStyle="ROUND"))
    i = i+0.001
  }  
}

编辑:如果您需要存储gBuffer结果:

buffergrow = function(shape) {
  i <- 1
  linebuffer <- vector("list", 10)
  for (k in 1:10) {
    linebuffer[[k]] <- gBuffer(l2, width=i, capStyle="ROUND")
    plot(linebuffer[[k]])
    i = i+0.001
  }  
  return(linebuffer)
}
于 2012-03-18T21:13:03.113 回答