2012-10-03 15 views
6

mergeに空間的な方法を追加しようとしていますが、それは2つの異なるオブジェクトのタイプをディスパッチするためです。S4 S3ディスパッチを基底R S3に追加する

次のように私は 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 

あなたは、xは本当に代わりにAの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からインポートする必要はありますか?

答えて

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

または明示的に提供するための標準的な派遣を可能に標準の一般的な設定になっています私のために働く。私は実際に私の質問の一例として持っている最初の。しかし、3番目の作品は素晴らしいです。 –

関連する問題