我正在尝试添加一个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")
})
Run Code Online (Sandbox Code Playgroud)
哪个工作:
x <- 1
class(x) <- "SpatialPolygonsDataFrame"
y <- data.frame()
> merge(x,y)
generic dispatch
method dispatch
Run Code Online (Sandbox Code Playgroud)
你将不得不相信我,如果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"
Run Code Online (Sandbox Code Playgroud)
我该如何避免?我已经尝试消除函数定义,setGeneric
以便它只是读取setGeneric("merge")
但不起作用.我需要以某种方式merge
从中导入S3泛型base
吗?
错误调度的发生是因为泛型的主体不是"标准"(我认为理由是,因为你做了除调用之外的其他事情standardGeneric("merge")
,你知道你在做什么所以没有自动默认;也许我是做到这一点,它真的是一个错误).解决方案是设置标准通用,允许默认调度
setGeneric("merge")
Run Code Online (Sandbox Code Playgroud)
或明确提供标准派遣
setGeneric("merge", function(x, y, ...) standardGeneric("merge"))
Run Code Online (Sandbox Code Playgroud)
或明确指定默认方法
setGeneric("merge", function(x, y, ...){
cat("generic dispatch\n")
standardGeneric("merge")
}, useAsDefault=base::merge)
Run Code Online (Sandbox Code Playgroud)