Что вызывает порядок классов R? - PullRequest
1 голос
/ 21 сентября 2019

Хэдли утверждает, что присвоение класса 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 

1 Ответ

5 голосов
/ 21 сентября 2019

Используется метод по умолчанию, только если ни один из методов для классов в векторе классов не найден.В вопросе нет print.numeric, но есть print.mytest, поэтому он используется в обоих случаях.Он никогда не ищет print.default, потому что он может найти метод среди перечисленных в векторе класса.

То есть он смотрит на первый элемент class(x), и если в этом случае printметод для этого класса найден, он использует его.Если нет, то он переходит ко второму элементу class(x) и ищет метод print этого класса.Если он найден, он использует его.Если бы было только два элемента class(x) и ни один из них не был найден, он использовал бы метод по умолчанию.

В случае, когда class(x) равен c("numeric", "mytest"), метод print.numeric отсутствует, поэтомуищет print.mytest и находит его таким образом, что использует его.

В случае, когда class(x) равен c("mytest", "numeric"), он находит print.mytest и поэтому использует его.

Таким образом, в обоих случаях print.mytest является выбранным методом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...