R: Должны ли универсальные методы работать внутри пакета без его подключения?

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

Например, следующий код создает два объекта 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.SpatialPointsDataFrame Исходный код показывает, что он вызывает rbind для пространственных точек:

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) x@data))
    SpatialPointsDataFrame(sp, df, coords.nrs = dots[[1]]@coords.nrs)
}

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

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

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

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

1 ответ

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

Другие вопросы по тегам