Вы можете перебирать классы экземпляра вашего подкласса. Например, предположим, что мы определили следующие классы и методы:
foo <- function(x, ...) {
UseMethod("foo")
}
bar <- function(x) {
class(x) <- c("bar", class(x))
return(x)
}
baz <- function(x) {
class(x) <- c("baz", "bar", class(x))
return(x)
}
foo.bar <- function(x, ...) {
cat("Bar:", x, "\n")
}
foo.default <- function(x, ...) {
cat("Default:", x, "\n")
}
И мы создали экземпляр baz
, подкласс bar
:
my_instance <- baz(1)
Сейчасмы могли бы найти все вызываемые методы из baz
и их родителей:
unname(unlist(sapply(class(my_instance), function(x) methods(class = x))))
[1] "foo.bar" "all.equal.numeric"
[3] "as.data.frame.numeric" "as.Date.numeric"
[5] "as.POSIXct.numeric" "as.POSIXlt.numeric"
[7] "as.raster.numeric" "coerce,ANY,numeric-method"
[9] "Ops,nonStructure,vector-method" "Ops,structure,vector-method"
[11] "Ops,vector,nonStructure-method" "Ops,vector,structure-method"
Теперь вызывать их все сложнее, поскольку все они имеют разные аргументы. Рассмотрим следующее:
sapply(unlist(sapply(class(my_instance), function(x) methods(class = x))),
function(f) get(f)(my_instance, 2))
Bar: 1
Error in as.Date.numeric(origin, ...) : 'origin' must be supplied
Конечно, нам, вероятно, также необходимо устранить такие вещи, как "Ops,nonStructure,vector-method"
:
z <- unname(unlist(sapply(class(my_instance), function(x) methods(class = x))))
z[!grepl(",", z)]
[1] "foo.bar" "all.equal.numeric" "as.data.frame.numeric"
[4] "as.Date.numeric" "as.POSIXct.numeric" "as.POSIXlt.numeric"
[7] "as.raster.numeric"