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