Получить методы, унаследованные от класса S3 и его родителя - PullRequest
0 голосов
/ 14 октября 2019

Если у меня есть класс 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)})

Есть идеи? Спасибо!

1 Ответ

1 голос
/ 14 октября 2019

Вы можете перебирать классы экземпляра вашего подкласса. Например, предположим, что мы определили следующие классы и методы:

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"   
...