我想在R中实现一个能够增加for循环中缓冲区大小的函数。
整体计划是编写一个包,它使用test-和reference-shapefile。它应该在引用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'时会发生错误。有没有人知道为什么会这样?我已经尝试了其他一些想法,但我需要一些帮助。
可选/另外:对于我的整体计划的进一步工作,您是否有一些提示?
祝你好运, 斯蒂芬
答案 0 :(得分:4)
您必须在访问其子元素之前初始化对象。 E.g:
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)
}