2012-10-03 11 views
6

S4 olması gereken (iki farklı nesnenin türlerini gönderdiği için) merge için uzamsal bir yöntem eklemeye çalışıyorum. aşağıdaki gibiS4 gönderimini R4 temeline ekleme jenerik

Bir earlier solution kullanarak denedi:

nasıl çalışır
#' 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") 
}) 

: Bir yerine Bana güvenmek zorunda gidiyoruz

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

x gerçekten de eğer bir SPDF Bir kod, aslında bu kodu çalıştırırsanız aldığınız yuva hatasını döndürmez (ya da yapma, ve sadece aşağıdaki hataya neden olmayan daha izin veren jenerik kullanın). SPDF'ler oluşturmak için bir acıdır.

> 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" 

Bunu nasıl engelleyebilirim:

sorun S3 gönderme üzerine görünüyor bu? setGeneric işlev tanımını ortadan kaldırmayı denedim, böylece setGeneric("merge") yazıyor, ancak bu da çalışmıyor. merge S3 jenerikini base'dan bir şekilde almam gerekir mi?

cevap

6

Yanlış gönderim, jenerik gövdesi "standart" olmadığı için oluşur (mantığın mantıklı olduğunu düşünüyorum, çünkü standardGeneric("merge") çağrısı dışında bir şey yaptınız, ne yaptığınızı biliyorsunuz, böylece otomatik varsayılan yok belki bunu yapıyorum ve gerçekten bir böcek). Çözümler

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

veya açıkça varsayılan bir yöntem Bunlardan

setGeneric("merge", function(x, y, ...){ 
    cat("generic dispatch\n") 
    standardGeneric("merge") 
}, useAsDefault=base::merge) 
+0

, sadece üçte belirtmek varsayılan sevk

setGeneric("merge") 

veya açıkça sağlamak için standart sevk sağlayan standart bir jenerik ayarlamak için vardır benim için çalışıyor. İlk önce soruma bir örnek verdim. Ama üçüncü zekice çalışır. –