Как заставить универсальную функцию R наследовать класс ее входных данных?

#r #class #inheritance #r-s3

Вопрос:

Пусть следующий код:

 x <- 1:5
class(x) <- "bar"

foo <- function(x) {
    UseMethod("foo")
}

foo.bar <- function(x) {
    y <- max(x)
    return(y)
}
 

Я хотел бы, чтобы вывод foo(x) имел тот же класс, x что и (т. Е. «бар»). Очевидный способ сделать это-добавить class(y) <- class(x) внутри foo.bar() , но я хотел бы знать, могу ли я сделать это сам по foo() себе.

Причина этого в том, что в моем реальном случае есть несколько универсальных методов, каждый из которых содержит более 10 методов, поэтому, если бы я мог наследовать класс в универсальных, мне просто пришлось бы изменить их вместо десятков методов.

Комментарии:

1. «но я хотел бы знать, могу ли я сделать это в самом foo ()» Нет, вы не можете. Подумайте о том, о чем вы просите. Методы могут возвращать что угодно. Как тогда универсальный должен применять что-то в отношении их возвращаемых значений?

Ответ №1:

Переименуйте foo foo_ , скажем, в, а затем определите foo , как вызывать foo_ , а затем установите класс.

 foo_ <- foo
foo <- function(x) structure(foo_(x), class = class(x))
foo(x)
 

дающий:

 [1] 5
attr(,"class")
[1] "bar"