题
我正在尝试添加一个空间方法 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
?
解决方案
发生错误调度是因为泛型的主体不是“标准”(我认为原因是这样的,因为你做了一些除了调用之外的事情) 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)
不隶属于 StackOverflow