R中“子集”方法的多重分派

Multiple dispatch for `subset` methods in R

我正在开发一个包,想为自定义 class、myclass 的对象编写两个子集方法,并分派两个参数,第一个是要子集的对象,class myclass,第二个是字符向量的逻辑值,如下所示:

setMethod(
    f = "subset",
    signature = c(x = "myclass", subset = "logical"),
    definition = function(x, subset){
            # function body 
    }
)

setMethod(
    f = "subset",
    signature = c(x = "myclass", subset = "character"),
    definition = function(x, subset){ 
        # different function body 
    }
)

但是,我不能这样做,因为 S3 泛型仅在一个参数上进行调度。而且我不想为 subset 创建一个新的泛型,因为它会在加载我的包时掩盖现有的泛型。 我认为,解决这个问题的一种方法是创建一个泛型和不同名称的方法,但这对用户来说不是很直观,对吧? 那么我 missing/misunderstanding 有什么用吗,有没有什么机智的方法可以为 S3 泛型进行多次分派?

通常在这种情况下,您会将 subset 设置为 S4 泛型,但由于您有理由不想这样做,您可以通过定义一个单独的泛型并从 S3 中调用它来解决这个问题方法,按照

mySubset <- function(x,subset){
  stop("this is only a generic function: it should never be called!")
}
setGeneric("mySubset")
## methods for mySubset
setMethod(
    f = "mySubset",
    signature = c(x = "myclass", subset = "logical"),
    definition = function(x, subset){
            # function body 
    }
)

setMethod(
    f = "mySubset",
    signature = c(x = "myclass", subset = "character"),
    definition = function(x, subset){ 
        # different function body 
    }
)

## default method using "ANY" (lower priority)
setMethod(
    f = "mySubset",
    signature = c(x = "myclass", subset = "ANY"),
    definition = function(x, subset){ 
       ## insert default behaviour (might be an error),
       ## a call to subset.default or whatever
    }
)

## now write an S3 method for subset that calls the S4 generic if
## x is of class myclass

subset.myClass <- function(x,subset){
  mySubset(x,subset)
}

这保留了子集的仅限 S3 的行为,但您现在可以对方法分派进行 S4 级别的控制,前提是 x 属于 class myclass.

您的用户不需要欣赏这种区别;当 x 有你的新 class.

时,他们仍然可以用他们习惯的方式打电话给 subset(x,class)