【问题标题】:How to increase buffer size in R-function如何增加 R 函数中的缓冲区大小
【发布时间】:2012-03-18 21:00:38
【问题描述】:

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

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

因此,我已经编写了一些代码 sn-ps 来插入 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”时会发生错误。有人知道为什么会这样吗?我已经尝试了其他一些想法,但我需要一些帮助。

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

最好的问候, 斯蒂芬

【问题讨论】:

    标签: r for-loop cran


    【解决方案1】:

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

    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)
    }
    

    【讨论】:

    • 谢谢。直接绘制结果有效,但我需要将结果存储在列表(或某处)中,以便稍后将结果与第二个 shapefile 进行比较。首先初始化对象是真的,但是还是有错误:linebuffer buffergrow(l2) Error in xy.coords(x, y, xlabel, ylabel, log) : 'x' is一个列表,但没有组件“x”和“y”我是否使用其他东西而不是 list() 来初始化行缓冲区?
    • @nomeus 请查看我的编辑。也许你得到Error in xy.coords,因为你错过了通过[[访问单个列表元素。
    • 为什么我使用该函数后无法访问linebuffer[[k]]?所有 10 个元素都只是 NULL。即使我将 linebuffer-initialization 移到函数之外。
    • @nomeus R 有不同的环境。全局环境的对象不能被函数改变(好的,你可以使用&lt;&lt;- 操作符)。您必须以下列方式调用您的函数:linebuffer &lt;- buffergrow(l2) 以访问函数外部的行缓冲区。这是非常基本的问题。恕我直言,您必须阅读 R 教程/手册。
    猜你喜欢
    • 1970-01-01
    • 2019-08-06
    • 2013-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-25
    • 1970-01-01
    相关资源
    最近更新 更多