2016-12-18 8 views
0

Я пишу пакет, который использует классы и функции из пространственной библиотеки sp. sp методы экспорта для rbind (правильно ли я вызываю rbind общий?).R: Должны ли общие методы работать внутри пакета без привязки?

Например, следующий код создает два SpatialPoints объектов, а затем использует rbind.SpatialPoints присоединиться к ним вместе:

> crdsA <- matrix(c(1,2,3,4), ncol = 2) 
> crdsB <- matrix(c(7,8), ncol = 2) 
> 
> sptsA <- sp::SpatialPoints(crdsA) 
> sptsB <- sp::SpatialPoints(crdsB) 
> 
> sp::rbind.SpatialPoints(sptsA, sptsB) 
SpatialPoints: 
    coords.x1 coords.x2 
[1,]   1   3 
[2,]   2   4 
[3,]   7   8 
Coordinate Reference System (CRS) arguments: NA 

Однако, если я затем преобразовать SpatialPoints в SpatialPointsDataFrame (более высокий уровень класс объекта в библиотеке sp), а затем используйте rbind.SpatialPointsDataFrame, я получаю сообщение об ошибке:

> sptsdfA <- sp::SpatialPointsDataFrame(sptsA, data.frame(IDs = c(1,2))) 
> sptsdfB <- sp::SpatialPointsDataFrame(sptsB, data.frame(IDs = 3)) 
> 
> sp::rbind.SpatialPointsDataFrame(sptsdfA, sptsdfB) 
Error in rbind2(..1, r) : 
    no method for coercing this S4 class to a vector 

Взгляд на rbind.SpatialPointsDataFramesource code показывает, что он называет rbind для SpatialPoints:

rbind.SpatialPointsDataFrame <- function(...) { 
    dots = list(...) 
    names(dots) <- NULL # bugfix Clement Calenge 100417 
    sp = do.call(rbind, lapply(dots, function(x) as(x, "SpatialPoints"))) 
    df = do.call(rbind, lapply(dots, function(x) [email protected])) 
    SpatialPointsDataFrame(sp, df, coords.nrs = dots[[1]]@coords.nrs) 
} 

Так что это, кажется, проблема, но я не понимаю, почему. Если я присоединяю библиотеку sp, то ни одна из этих проблем не возникает, но я думал, что с rbind вызывается внутри внутри rbind.SpatialPointsDataFrame, тогда остальная часть библиотеки не была прикреплена.

В контексте пакета, который я создаю, даже если я включаю import(sp) и importFrom(sp,rbind.SpatialPoints) в NAMESPACE, код выше не работает.

Я думаю, что я не понимаю, что касается загрузки, установки и импорта пакетов. Может ли кто-нибудь объяснить, почему sp::rbind.SpatialPointsDataFrame не работает без остальной части прикрепляемой библиотеки и как я могу заставить ее работать в моем пакете?

Большое спасибо!

ответ

0

rbind не является обычным общим: поскольку его подпись имеет ... в качестве своего первого (и единственного) аргумента, он не может отправить первый аргумент. Во всех случаях было проблематично программировать методы для этого. Вы посмотрели maptools::spRbind?

+0

Спасибо. Я действительно использовал 'maptools :: spRbind' как временное (или, возможно, постоянное?) Решение. Я прочитал о методе отправки [здесь] (http://adv-r.had.co.nz/S3.html), и поэтому это немного имеет смысл ... хотя я не совсем понимаю, как это относится к упаковке прилагается или нет? –