سؤال

أحاول إضافة طريقة مكانية إلى 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)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top