merge
S4である必要がある空間メソッドを追加しようとしています(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
ますか?