Написание функций в R - вызов внешних функций из библиотек
Поэтому я пытаюсь взять немного кода, который я использую для интерактивного выбора и идентификации. Он работает вне функции, но выдает ошибку, когда я пытаюсь запустить его как отдельную функцию.
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 ответа
Это должно работать. 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)
Вам необходимо добавить вызов к пакету в вашей функции:
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)
}