Добавление отправки 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)
Другие вопросы по тегам