Написание функций в R - вызов внешних функций из библиотек - PullRequest
1 голос
/ 19 августа 2011

Поэтому я пытаюсь взять немного кода, который я использую для интерактивного выбора и идентификации.Он работает вне функции, но выдает ошибку, когда я пытаюсь запустить его как отдельную функцию.

my.identify <- function(data)
  {
    # allows you to create a polygon by clicking on map 
   region = locator(type = "o")  
   n = length(region$x)
   p = Polygon(cbind(region$x, region$y)[c(1:n,1),])
   ps = Polygons(list(p), ID="region")
   sps = SpatialPolygons(list(ps))

   # returns all data that overlaps new polygon sps
   a=data[!is.na(overlay(data,sps)),]    # here is the problem
   return(a)
  }

По сути, он не хочет запускать функцию наложения (функция пакета sp ).Сообщение об ошибке в том, что я не могу запустить унаследованные функции ??

Ошибка в функции (классы, fdef, mtable): невозможно найти унаследованный метод для функции "overlay", для сигнатуры "matrix", "SpatialPolygons"

Есть идеи???Я новичок в написании функций ... так что, надеюсь, это будет легко.

Ответы [ 2 ]

1 голос
/ 05 декабря 2011

Это должно работать. overlay устарело и вместо него следует использовать over. Подвох в том, что все объекты должны быть Spatial*.

xy <- data.frame(x = runif(40, min = -200, max = 200),
    y = runif(40, min = -200, max = 200))
plot(xy)
my.identify <- function(data) {
    # allows you to create a polygon by clicking on map 
    region = locator(type = "o")  
    n = length(region$x)
    p = Polygon(cbind(region$x, region$y)[c(1:n,1),])
    ps = Polygons(list(p), ID="region")
    sps = SpatialPolygons(list(ps))

    # returns all data that overlaps new polygon sps
    a=data[!is.na(over(SpatialPoints(data),sps)),]
    return(a)
}
ident <- my.identify(xy)
points(ident, pch = 16)

enter image description here

0 голосов
/ 05 декабря 2011

Вам необходимо добавить вызов к пакету в вашей функции:

 my.identify <- function(data)
 {
      require('sp')  ## Call to load the sp package for use in stand alone function
      # allows you to create a polygon by clicking on map
      region = locator(type = "o")
      n = length(region$x)
      p = Polygon(cbind(region$x, region$y)[c(1:n,1),])
      ps = Polygons(list(p), ID="region")
      sps = SpatialPolygons(list(ps))


      # returns all data that overlaps new polygon sps
      a=data[!is.na(overlay(data,sps)),]

      return(a)
 } 
...