Добавление диспетчеризации S4 в базовый универсальный вариант R S3

StackOverflow https://stackoverflow.com//questions/12709933

  •  13-12-2019
  •  | 
  •  

Вопрос

Я пытаюсь добавить пространственный метод в 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?

Это было полезно?

Решение

Неправильная отправка происходит потому, что тело обобщенного шаблона не является «стандартным» (я думаю, причина в том, что, поскольку вы сделали что-то кроме вызова 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)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top