1

forループでバッファのサイズを増やすことができる関数をRに実装したいと思います。

全体的な計画は、テスト用および参照用のシェープファイルを使用するパッケージを作成することです。参照シェープファイルの周りにバッファーを作成し、必要なだけサイズを増やして、テスト シェープファイル全体と交差する必要があります。

したがって、シェープファイルを挿入して最初のバッファーを作成するためのコード スニペットを既にいくつか書きました。

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」を引数 (shape) として関数「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 に答える