Как увеличить размер буфера в R-функции - PullRequest
1 голос
/ 19 марта 2012

Я хотел бы реализовать функцию в R, которая может увеличить размер буфера в цикле for.

Общий план состоит в том, чтобы написать пакет, который использует тестирование иэталонный файл формы.Он должен создать буфер вокруг эталонного шейп-файла и увеличивать его по мере необходимости, чтобы он пересекался со всем тестовым шейп-файлом.

Поэтому я уже написал несколько фрагментов кода, чтобы вставить шейп-файлы и создать первый буфер:

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

Как видите, возникает ошибка, когда я вызываю функцию buffergrow с l2в качестве аргумента (формы).У кого-нибудь есть идея, почему это происходит?Я уже пробовал некоторые другие идеи, но мне нужна помощь.

Опционально / дополнительно: У вас есть какие-то советы для меня относительно дальнейшей работы над моим общим планом?

С уважением, Стефан

1 Ответ

4 голосов
/ 19 марта 2012

Вы должны инициализировать объект перед доступом к его подэлементам.Например:

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