【发布时间】:2012-10-03 13:49:21
【问题描述】:
我正在尝试向merge 添加一个空间方法,它需要是 S4(因为它调度两个不同对象的类型)。
我尝试使用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 真的是 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"),但这也不起作用。我需要以某种方式从base 导入merge S3 泛型吗?
【问题讨论】: