2012-10-03 10 views
6

पर एस 4 प्रेषण जोड़ना मैं merge पर एक स्थानिक विधि जोड़ने की कोशिश कर रहा हूं जिसे एस 4 होना चाहिए (क्योंकि यह दो अलग-अलग वस्तुओं के प्रकारों पर प्रेषित होता है)।आधार आर एस 3 जेनेरिक

मैं इस प्रकार एक earlier solution उपयोग करने की कोशिश की है:

#' 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 

आप मुझ पर भरोसा करने के लिए जा रहे हैं कि एक्स वास्तव में है अगर एक SPDF एक के बजाय एक फिक्र किया गया है, कि अगर आप वास्तव में उस कोड को चलाते हैं तो आपको स्लॉट त्रुटि नहीं मिलती है (या नहीं, और केवल अधिक अनुमोदित जेनेरिक का उपयोग करें जो त्रुटि को वापस नहीं करता है)। एसपीडीएफ बनाने के लिए एक दर्द है।

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

मुझे लगता है कि कैसे बच है:

समस्या यह है कि एस 3 प्रेषण ओवरराइट है लगता है? मैंने setGeneric से फ़ंक्शन परिभाषा को समाप्त करने का प्रयास किया है ताकि यह आसानी से setGeneric("merge") पढ़ सके लेकिन यह या तो काम नहीं करता है। क्या मुझे किसी भी तरह merge एस 3 जेनेरिक base से आयात करने की ज़रूरत है?

उत्तर

6

गलत प्रेषण होता है क्योंकि जेनेरिक का शरीर "मानक" नहीं है (मुझे लगता है कि तर्क यह है कि, आपने standardGeneric("merge") को आमंत्रित करने के अलावा कुछ और किया है, आप जानते हैं कि आप क्या कर रहे हैं, कोई स्वचालित डिफ़ॉल्ट नहीं ; शायद मैं इसे बना रहा हूं और यह वास्तव में एक बग है)। समाधान

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

या स्पष्ट रूप से एक डिफ़ॉल्ट विधि

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

केवल तीसरी निर्दिष्ट डिफ़ॉल्ट प्रेषण

setGeneric("merge") 

या स्पष्ट रूप से प्रदान करने के लिए मानक प्रेषण के लिए एक मानक सामान्य अनुमति देता है स्थापित करने के लिए कर रहे हैं मेरे लिये कार्य करता है। सबसे पहले मुझे अपने प्रश्न में एक उदाहरण के रूप में मिला है। लेकिन तीसरा काम शानदार ढंग से। –