Методы по умолчанию
Часть раздела Объектно-ориентированное программирование путешествия по R на Coddy. Урок 8 из 57.
Если ни один метод не соответствует классу, UseMethod() ищет метод по умолчанию — name.default. Это запасной вариант для любого класса, о котором обобщённая функция ничего не знает:
describe <- function(x) UseMethod("describe")
describe.dog <- function(x) paste("a dog called", x$name)
describe.default <- function(x) "something I do not know"
rex <- structure(list(name = "Rex"), class = "dog")
car <- structure(list(), class = "car")
print(describe(rex))
print(describe(car))Вывод:
[1] "a dog called Rex"
[1] "something I do not know"Без метода по умолчанию вызов обобщённой функции для неизвестного класса завершается ошибкой:
describe <- function(x) UseMethod("describe")
describe.dog <- function(x) paste("a dog called", x$name)
car <- structure(list(), class = "car")
describe(car)Вывод:
Error in UseMethod("describe") :
no applicable method for 'describe' applied to an object of class "car"
Calls: describe
Execution haltedОбычные значения тоже участвуют в диспетчеризации. Число без атрибута класса имеет неявный класс numeric, текст имеет character, а TRUE имеет logical, поэтому методы с такими именами работают с обычными векторами:
describe <- function(x) UseMethod("describe")
describe.numeric <- function(x) paste("numbers adding up to", sum(x))
describe.character <- function(x) paste("words:", paste(x, collapse = " "))
describe.default <- function(x) "something else"
print(describe(c(1, 2, 3)))
print(describe(c("a", "b")))
print(describe(TRUE))Вывод:
[1] "numbers adding up to 6"
[1] "words: a b"
[1] "something else"Метод по умолчанию также может вежливо отказаться: stop() с сообщением, в котором указывается класс, чтобы вызывающий код понимал, что пошло не так. class(x)[1] — это первый класс объекта:
area <- function(shape) UseMethod("area")
area.square <- function(shape) shape$side^2
area.default <- function(shape) {
stop("cannot compute the area of a ", class(shape)[1], call. = FALSE)
}
for (s in list(structure(list(side = 2), class = "square"), structure(list(), class = "blob"))) {
cat(tryCatch(area(s), error = function(e) conditionMessage(e)), "\n")
}Результат:
4
cannot compute the area of a blob Задание
ЛегкоЗавершите обобщённую функцию describe(x) в Describe.R и её методы для обычных векторов:
describe.numeric()возвращает3 numbers, sum 6.describe.character()возвращает2 words, longest: apple(первое из самых длинных слов при совпадении длины).describe.logical()возвращает2 of 3 are TRUE.describe.default()возвращаетsomething else.
Предоставленный код считывает строки num 1,2,3, chr apple,kiwi, lgl TRUE,FALSE,TRUE или любое другое слово со значениями, преобразуя их в список. Он выводит describe() для каждой строки.
Ваш код должен находиться в Describe.R. В main.R содержится предоставленный код ввода/вывода, и его нельзя изменять.
Попробуйте сами
source("Describe.R")
# Предоставленный код ввода/вывода: оставьте его как есть
input <- suppressWarnings(readLines(file("stdin")))
for (line in input) {
p <- strsplit(line, " ")[[1]]
values <- strsplit(p[2], ",")[[1]]
x <- switch(p[1],
num = as.numeric(values),
chr = values,
lgl = as.logical(values),
list(values))
cat(describe(x), "\n", sep = "")
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы S3
Работа с файламиСписки с классомФункции-конструкторыМетоды print и formatВалидаторы и вспомогательные функцииПовторение — температуры4Инкапсуляция в R
Замыкания как объектыОкружения как объектыФункции доступаЗащита состоянияПовторение — парковочный счётчик7S4 Наследование
Расширение с помощью containscallNextMethodВиртуальные классыПроверка типов с помощью is()Повторение — смотритель зоопарка10Шаблоны проектирования, часть 2
Шаблон «Декоратор»Шаблон «Строитель»Шаблон «Состояние»Шаблон «Итератор»2Обобщённые функции и методы S3
Обобщённые функции и UseMethodМетоды по умолчаниюМетоды для базовых обобщённых функцийОсновы NextMethodПовторение — площади фигур5Классы S4
Определение классов S4Слоты и доступПроверка корректностиМетоды showПовторение — каталог товаров8Ссылочные классы
Определение ссылочных классовМетоды и обновление полейСемантика копированияНаследование и callSuperПовторение — очередь задач11Проект: Управление библиотекой
Книги и читателиВыдача книг3Наследование S3
Векторы классовПорядок поиска методовРасширение с помощью NextMethodПроверка с помощью inherits()Повторение — расчёт зарплаты сотрудниковПотренируйтесь самостоятельно: Онлайн-компилятор R