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)
我正在开发一个包,想为自定义 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)