У меня есть вопрос о «правильном» способе что-то сделать с классами S3 в R. Что я хочу сделать, так это иметь метод, который изменяет класс и затем вызывает тот же метод для нового класса. Примерно так:
my_func <- function(.x, ...) {
UseMethod("my_func")
}
my_func.character <- function(.x, ...) {
return(paste(".x is", .x, "of class", class(.x)))
}
my_func.numeric <- function(.x, ...) {
.x <- as.character(.x)
res <- my_func(.x) # this should call my_func.character
return(res)
}
И это работает. Когда я делаю следующее, я получаю класс character
для обоих
> my_func("hello")
[1] ".x is hello of class character"
> my_func(1)
[1] ".x is 1 of class character"
Мой вопрос: это правильный способ сделать это? Что-то странное в повторном вызове того же метода после того, как я преобразовал класс (эта строка res <- my_func(.x)
).
Я чувствовал, что NextMethod()
должен как-то быть ответом, но я прочитал на нем куча документов (например, , это и , это ), но все они говорят об этом, когда он прыгает на следующий класс в списке классов, например, из data.frame
до matrix
, если у вас есть class(df)
и получите, например, c("data.frame", "matrix")
.
Но никто из них не говорит об этой ситуации, когда вы конвертируете ее в совершенно другой класс, которого не было в исходной иерархии. Так что, возможно, NextMethod()
не , что нужно использовать, но есть ли что-то еще, или я должен просто оставить это, как у меня?
Спасибо!