Добавление отправки S4 к базе R S3
Я пытаюсь добавить пространственный метод merge
который должен быть S4 (так как он отправляет на типы двух разных объектов).
Я попытался использовать более раннее решение следующим образом:
#' Merge a SpatialPolygonsDataFrame with a data.frame
#' @param SPDF A SpatialPolygonsDataFrame
#' @param df A data.frame
#' @param \dots Parameters to pass to merge.data.frame
#'
#' @export
#' @docType methods
#' @rdname merge-methods
setGeneric("merge", function(SPDF, df, ...){
cat("generic dispatch\n")
standardGeneric("merge")
})
#' @rdname merge-methods
#' @aliases merge,SpatialPolygonsDataFrame,data.frame-method
setMethod("merge",c("SpatialPolygonsDataFrame","data.frame"), function(SPDF,df,...) {
cat("method dispatch\n")
})
Который работает:
x <- 1
class(x) <- "SpatialPolygonsDataFrame"
y <- data.frame()
> merge(x,y)
generic dispatch
method dispatch
Вы должны будете поверить мне, что если x действительно SPDF, а не фальшивый, то он не возвращает ошибку слота, которую вы получаете, если вы действительно запускаете этот код (или не выполняете, а просто используете более обобщающий ниже, который не возвращает ошибку). SPDF - это боль для создания.
Проблема в том, что он, кажется, перезаписал диспетчеризацию S3:
> merge(y,y)
generic dispatch
Error in function (classes, fdef, mtable) :
unable to find an inherited method for function "merge", for signature "data.frame", "data.frame"
Как мне избежать этого? Я попытался удалить определение функции из setGeneric
так что он просто читает setGeneric("merge")
но это тоже не работает. Нужно ли как-то импортировать merge
S3 общий от base
?
1 ответ
Неправильная отправка происходит из-за того, что тело генерика не является "стандартным" (я думаю, что обоснование таково, поскольку вы сделали что-то другое, кроме вызова standardGeneric("merge")
вы знаете, что вы делаете, так что нет автоматического дефолта; возможно я это придумываю и это действительно ошибка). Решения должны установить стандартный универсальный, позволяющий отправку по умолчанию
setGeneric("merge")
или явно предоставить стандартную отправку
setGeneric("merge", function(x, y, ...) standardGeneric("merge"))
или явно указать метод по умолчанию
setGeneric("merge", function(x, y, ...){
cat("generic dispatch\n")
standardGeneric("merge")
}, useAsDefault=base::merge)