【问题标题】:Adding S4 dispatch to base R S3 generic将 S4 调度添加到基本 R S3 通用
【发布时间】: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 泛型吗?

【问题讨论】:

    标签: r s4


    【解决方案1】:

    由于泛型的主体不是“标准”而发生错误发送(我认为原因是,由于您已经做了除调用 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)
    

    【讨论】:

    • 其中,只有第三个对我有用。第一个我实际上在我的问题中得到了一个例子。但第三个效果很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-29
    • 2019-02-19
    • 1970-01-01
    • 1970-01-01
    • 2016-10-28
    • 1970-01-01
    • 2016-10-14
    相关资源
    最近更新 更多