8

mergeS4である必要がある空間メソッドを追加しようとしています(2つの異なるオブジェクトのタイプにディスパッチするため)。

私は次のように以前の解決策を使用しようとしました:

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

xが偽物ではなく実際にSPDFである場合、実際にそのコードを実行した場合に発生するスロットエラーを返さない(または実行しないで、単にエラーを返さない以下のより寛容なジェネリック)。SPDFは作成するのが面倒です。

問題は、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"

どうすればそれを回避できますか?から関数定義を削除してsetGeneric、単純に読み取るようにしましたsetGeneric("merge")が、それも機能しません。mergeどういうわけかS3ジェネリックをからインポートする必要がありbaseますか?

4

1 に答える 1

8

ジェネリックの本体が「標準」ではないためにミスディスパッチが発生します(呼び出し以外のこと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)
于 2012-10-03T16:19:08.030 に答える