0

如果我有一个从父类继承的 S3 类,我如何返回我可以调用的泛型方法列表 - 既来自 S3 类,也来自父类。

所以创建的对象的类是: c("my_s3_class", "parent_s3_class")

以下适用于返回方法my_s3_class

methods(class = my_s3_class)

但它不包括可调用的泛型函数,而仅在父级中实现parent_s3_class

最终,我想使用类似下面的方法调用每个方法(这可行,但不包括父泛型方法)。使用get()意味着我不能使用NextMethod(),否则这将是一个合理的解决方法。my_s3_class注意我有一个我已经表示为的实例my_s3_class_instance- 这只是一个实现细节。

result <- sapply(methods(class = class(my_s3_class_instance)[1]),
                 function(f) {
                     print(paste("Executing:",f))
                     get(f)(my_s3_class_instance)})

有任何想法吗?谢谢!

4

1 回答 1

1

您可以遍历子类实例的类。例如,假设我们定义了以下类和方法:

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)

现在我们可以找到所有可调用的方法,frombaz和 parent(s):

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"   
于 2019-10-14T17:03:49.123 回答