Mike
Mike

Reputation: 11

Writing functions in R - calling external functions from libraries

So I am trying to take a bit of code that I use for interactive selection and identification. It works outside of a function but gives an error when I try to run it as a stand alone function.

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

Basically it doesn't want to run the overlay function (function of the sp package). The error report is that I can't run the inherited functions??

Error in function (classes, fdef, mtable) : unable to find an inherited method for function "overlay", for signature "matrix", "SpatialPolygons"

Any ideas??? I'm new to function writing... so hopefully it will be easy.

Upvotes: 1

Views: 1503

Answers (2)

Roman Luštrik
Roman Luštrik

Reputation: 70643

This should work. overlay is deprecated and over should be used instead. The catch is that all objects should be 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

Upvotes: 1

Mischa Vreeburg
Mischa Vreeburg

Reputation: 1586

You need to add a call to the package in your function:

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

Upvotes: 0

Related Questions