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
?