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