Я создал несколько методов S3, которые я контролирую, задавая классы для объекта. Что-то вроде этого:Объединение методов S3
myfun <- function (x) {
UseMethod("myfun")
}
myfun.a <- function(x) {
print("Type a")
}
myfun.b <- function(x) {
print("Type b")
}
myfun.c <- function(x) {
print("Type c")
}
myfun(structure(c(1:3), class = "a"))
# [1] "Type a"
myfun(structure(c(1:3), class = "b"))
# [1] "Type b"
myfun(structure(c(1:3), class = "c"))
# [1] "Type c"
Иногда некоторое подмножество классов способны делить метод что-то вроде этого:
otherfun <- function (x) {
UseMethod("otherfun")
}
otherfun.a <- function(x) {
print("Type a")
}
otherfun.b <- function(x) { ## Doesn't work because its only called for "b"
print("Type b or c")
}
otherfun(structure(c(1:3), class = "a"))
# [1] "Type a"
otherfun(structure(c(1:3), class = "b"))
# [1] "Type b or c"
otherfun(structure(c(1:3), class = "c"))
# [1] "Type b or c"
Что является лучшим/наиболее правильным способом реализации несколько типов классов Подселения метод? Я не хочу ставить классы на объект, потому что классы «b» и «c» различаются в большинстве аспектов.
Я думал об использовании метода по умолчанию и вручную разборе типа класса, что-то вроде:
otherfun <- function (x) {
UseMethod("otherfun")
}
otherfun.a <- function(x) {
print("Type a")
}
otherfun.b <- function(x) {
print("Type b or c")
}
otherfun.default <- function(x) {
if(class(x) == "c") otherfun.b(x)
else stop("Bad Class on x")
}
otherfun(structure(c(1:3), class = "a"))
# [1] "Type a"
otherfun(structure(c(1:3), class = "b"))
# [1] "Type b or c"
otherfun(structure(c(1:3), class = "c"))
# [1] "Type b or c"
Мне это нравится, спасибо ... Я буду принимать это как ответ завтра. –