Metody print i format
Część sekcji Programowanie obiektowe ścieżki R w Coddy. Lekcja 4 z 57.
Gdy wyświetlana jest wartość, R wywołuje funkcję print(). Bez niczego specjalnego dla klasy obiekt S3 jest wyświetlany jako lista, po której następuje atrybut klasy, co utrudnia odczytanie:
m <- structure(list(amount = 9.5, currency = "EUR"), class = "money")
print(m)Wynik:
$amount
[1] 9.5
$currency
[1] "EUR"
attr(,"class")
[1] "money"Metoda to funkcja o nazwie generic.class. Gdy print() otrzymuje obiekt klasy money, szuka print.money() i wywołuje ją zamiast tego. Metoda print wypisuje tekst za pomocą cat() i kończy działanie instrukcją invisible(x), dzięki czemu zwraca obiekt, nie wypisując go po raz drugi:
print.money <- function(x, ...) {
cat("<money ", x$amount, " ", x$currency, ">\n", sep = "")
invisible(x)
}
m <- structure(list(amount = 9.5, currency = "EUR"), class = "money")
print(m)
mWynik:
<money 9.5 EUR>
<money 9.5 EUR>format() to ogólna funkcja służąca do zamieniania wartości na tekst. Metoda format.money() zwraca tekst zamiast go wyświetlać, dzięki czemu inny kod może umieścić go w zdaniu, a metoda print może go ponownie wykorzystać:
format.money <- function(x, ...) {
sprintf("%.2f %s", x$amount, x$currency)
}
print.money <- function(x, ...) {
cat("Money:", format(x), "\n")
invisible(x)
}
m <- structure(list(amount = 9.5, currency = "EUR"), class = "money")
m
cat("You owe", format(m), "\n")Wynik:
Money: 9.50 EUR
You owe 9.50 EUR Metoda przyjmuje te same argumenty co jej funkcja generyczna. Funkcje print() i format() są zadeklarowane jako function(x, ...), więc ich metody również zaczynają się od x, .... ... przyjmuje dodatkowe argumenty, takie jak digits, które może przekazać wywołujący. Metody działają wszędzie tam, gdzie wywoływana jest funkcja generyczna, na przykład wewnątrz vapply():
format.money <- function(x, ...) sprintf("%.2f %s", x$amount, x$currency)
wallet <- list(
structure(list(amount = 3, currency = "EUR"), class = "money"),
structure(list(amount = 0.5, currency = "USD"), class = "money")
)
print(vapply(wallet, format, character(1)))Wynik:
[1] "3.00 EUR" "0.50 USD"Wyzwanie
ŁatwyPodano new_money() w pliku Money.R. Dodaj dwie metody do tego samego pliku:
format.money(x, ...)zwraca kwotę z dwoma miejscami po przecinku oraz walutę:9.50 EUR.print.money(x, ...)wypisuje<money 9.50 EUR>w osobnym wierszu, używającformat(), i zwracainvisible(x).
Dostarczony kod odczytuje wiersze 9.5 EUR, wypisuje każdy obiekt money, a następnie wypisuje list: ze wszystkimi sformatowanymi kwotami połączonymi za pomocą + .
Twój kod umieść w pliku Money.R. Plik main.R zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.
Spróbuj swoich sił
source("Money.R")
# Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
input <- suppressWarnings(readLines(file("stdin")))
all <- list()
for (line in input) {
p <- strsplit(line, " ")[[1]]
m <- new_money(as.numeric(p[1]), p[2])
print(m)
all[[length(all) + 1]] <- m
}
cat("list: ", paste(vapply(all, format, character(1)), collapse = " + "), "\n", sep = "")
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy S3
Praca z plikamiListy z klasąFunkcje konstruktoraMetody print i formatWalidatory i funkcje pomocniczePowtórzenie — temperatury4Enkapsulacja w R
Domknięcia jako obiektyŚrodowiska jako obiektyFunkcje dostępoweOchrona stanuPodsumowanie – parkometr2Generics i metody S3
Generics i UseMethodMetody domyślneMetody dla podstawowych genericsPodstawy NextMethodPowtórzenie — pola figur5Klasy S4
Definiowanie klas S4Sloty i dostępSprawdzanie poprawnościMetody wyświetlaniaPodsumowanie – katalog produktów8Klasy referencyjne
Definiowanie klas referencyjnychMetody i aktualizacja pólSemantyka kopiowaniaDziedziczenie i callSuperPodsumowanie – kolejka zadań11Projekt: Zarządzanie biblioteką
Książki i czytelnicyWypożyczanie książek3Dziedziczenie S3
Wektory klasKolejność wyszukiwania metodRozszerzanie za pomocą NextMethodSprawdzanie za pomocą inherits()Powtórzenie — lista płac pracownikówPoćwicz samodzielnie: Kompilator R online