Pregunta

Estoy intentando agregar un método espacial a merge que debe ser S4 (ya que se envía según los tipos de dos objetos diferentes).

He intentado usar un solución anterior como sigue:

#' 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")
})

Que funciona:

x <- 1
class(x) <- "SpatialPolygonsDataFrame"
y <- data.frame()
> merge(x,y)
generic dispatch
method dispatch

Tendrás que confiar en mí en que si x es realmente un SPDF en lugar de uno falso, no devuelve el error de ranura que obtienes si realmente ejecutas ese código (o no lo haces, y simplemente usas el genérico más permisivo a continuación que no devuelve el error).Los SPDF son difíciles de crear.

El problema es que parece haber sobrescrito el envío de 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"

¿Cómo evito eso?Intenté eliminar la definición de función de setGeneric para que simplemente se lea setGeneric("merge") pero eso tampoco funciona.¿Necesito importar de alguna manera el merge S3 genérico de base?

¿Fue útil?

Solución

El error en el envío se produce porque el cuerpo del genérico no es "estándar" (creo que la razón es que, dado que has hecho algo más que invocar standardGeneric("merge"), sabes lo que estás haciendo, por lo que no hay un valor predeterminado automático;tal vez me estoy inventando esto y en realidad es un error).Las soluciones son establecer un estándar genérico que permita el envío predeterminado.

setGeneric("merge")

o para proporcionar explícitamente envío estándar

setGeneric("merge", function(x, y, ...) standardGeneric("merge"))

o especificar explícitamente un método predeterminado

setGeneric("merge", function(x, y, ...){
  cat("generic dispatch\n")
  standardGeneric("merge")
}, useAsDefault=base::merge)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top