gpt4 book ai didi

r - R中 `subset`方法的多重分派(dispatch)

转载 作者:行者123 更新时间:2023-12-05 05:17:21 25 4
gpt4 key购买 nike

我正在开发一个包,想为自定义类 myclass 的对象编写两个子集方法,并分派(dispatch)两个参数,第一个是类 的子集对象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 创建一个新的泛型,因为它会在我的包加载时掩盖现有的泛型。我认为,解决这个问题的一种方法是创建一个泛型和不同名称的方法,但这对用户来说不是很直观,对吧?那么我是否遗漏/误解了什么,是否有任何机智的方法可以对 S3 泛型进行多次分派(dispatch)?

最佳答案

通常在这种情况下,您会将 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 的行为,但如果 x 属于 myclass 类,您现在可以对方法分派(dispatch)进行 S4 级别的控制。

您的用户不需要欣赏这种区别;当 x 有你的新类时,他们仍然可以按照他们习惯的方式调用 subset(x,class)

关于r - R中 `subset`方法的多重分派(dispatch),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49346939/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com