Хэдли утверждает, что присвоение класса class(x) <- c("A", "B")
выполняет следующее:
Как обсуждалось в следующем разделе, R ищет методы в том порядке, в котором они появляются ввектор класса.Таким образом, в этом примере это будет похоже на то, как класс A наследуется от класса B - если метод не определен для A, он вернется к B. Однако, если вы изменили порядок классов, обратное будет верно!
Вот что я понимаю:
print.mytest <- function(x, ...) {
cat(paste0("Just a test for class mytest: ", x, "\n")
}
x <- 1
print(class(x))
# [1] "numeric"
print(x)
# [1] 1
class(x) <- c("mytest")
print(class(x))
# [1] "mytest"
print(x)
# [1] "Just a test for class mytest: 1"
Вот что я не понимаю: я ожидал использования класса numeric
, но он никогда не использовался.Таким образом, я ожидал бы вывод [1] 1
во втором случае.
x <- 1
print(class(x))
# [1] "numeric"
class(x) <- c(class(x), "mytest")
print(class(x))
# [1] "numeric" "mytest"
print(x) # Not understood (http://adv-r.had.co.nz/S3.html)
# [1] "Just a test for class mytest: 1"
x <- 1
print(class(x))
# [1] "numeric"
class(x) <- c("mytest", class(x))
print(class(x))
# [1] "mytest" "numeric"
print(x) # Not understood...
# [1] "Just a test for class mytest: 1"
Документы ?class
также сообщают
Когда универсальная функция fun применяется кобъект с атрибутом класса c («first», «second»), система ищет функцию с именем fun.first и, если находит, применяет ее к объекту.Если такая функция не найдена, пробуется функция с именем fun.second.Если ни одно имя класса не создает подходящую функцию, используется функция fun.default (если она существует).
Спасибо за ответ ниже
x <- 1
print(class(x))
class(x) <- c("mytest2", "mytest")
print(class(x))
print(x)
# Just a test for class mytest2: 1
x <- 1
print(class(x))
class(x) <- c("mytest", "mytest2")
print(class(x))
print(x)
# Just a test for class mytest: 1