سؤال
أحاول إضافة طريقة مكانية إلى merge
الذي يجب أن يكون س 4 (لأنه يرسل على أنواع كائنين مختلفين).
لقد حاولت استخدام الحل السابق على النحو التالي:
#' 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
وأنت تسير أن تثق بي أنه إذا س هو حقا سبدف بدلا من واحد مزورة ، أنه لا يعود الخطأ فتحة التي تحصل عليها إذا كنت فعلا تشغيل هذا الرمز (أو لا ، ومجرد استخدام أكثر تساهلا عام أدناه الذي لا يعود الخطأ).سبدفس هي الألم لخلق.
المشكلة هي أنه يبدو أنه قد تم الكتابة فوق إرسال إس 3:
> 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
ج3 عام من 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)