我正在尝试添加一个merge
需要 S4 的空间方法(因为它在两个不同对象的类型上调度)。
我尝试使用早期的解决方案,如下所示:
#' 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
?