Method print dan format
Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan R di Coddy. Pelajaran 4 dari 57.
Saat suatu nilai dicetak, R memanggil fungsi print(). Tanpa perlakuan khusus untuk class, object S3 dicetak sebagai list-nya, diikuti atribut class, sehingga sulit dibaca:
m <- structure(list(amount = 9.5, currency = "EUR"), class = "money")
print(m)Output:
$amount
[1] 9.5
$currency
[1] "EUR"
attr(,"class")
[1] "money"Sebuah method adalah fungsi bernama generic.class. Saat print() menerima object dari class money, fungsi ini mencari print.money() dan memanggilnya sebagai gantinya. Sebuah method print menulis dengan cat() dan diakhiri dengan invisible(x), sehingga mengembalikan object tanpa mencetaknya untuk kedua kalinya:
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)
mOutput:
<money 9.5 EUR>
<money 9.5 EUR>format() adalah cara umum untuk mengubah nilai menjadi teks. Method format.money() mengembalikan teks alih-alih mencetaknya, sehingga kode lain dapat memasukkannya ke dalam kalimat, dan method print dapat menggunakannya kembali:
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")Output:
Money: 9.50 EUR
You owe 9.50 EUR Sebuah method menerima argumen yang sama dengan generic-nya. print() dan format() dideklarasikan sebagai function(x, ...), jadi method-nya juga dimulai dengan x, .... ... menerima argumen tambahan seperti digits yang dapat diberikan oleh pemanggil. Method bekerja di mana pun generic dipanggil, misalnya di dalam 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)))Output:
[1] "3.00 EUR" "0.50 USD"Tantangan
Mudahnew_money() di Money.R sudah tersedia. Tambahkan dua method ke file yang sama:
format.money(x, ...)mengembalikan jumlah dengan dua angka desimal dan mata uang:9.50 EUR.print.money(x, ...)mencetak<money 9.50 EUR>pada baris tersendiri, menggunakanformat(), dan mengembalikaninvisible(x).
Kode yang disediakan membaca baris 9.5 EUR, mencetak setiap object money, lalu mencetak list: dengan semua jumlah yang sudah diformat dan digabungkan dengan + .
Kodemu ditulis di Money.R. main.R berisi kode input/output yang disediakan dan tidak boleh diedit.
Coba sendiri
source("Money.R")
# Kode input/output yang disediakan: biarkan apa adanya
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 = "")
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Object
1Dasar S3
Bekerja dengan fileList dengan classFungsi KonstruktorMethod print dan formatValidator dan helperUlasan: Suhu4Enkapsulasi di R
Closure sebagai objectEnvironment sebagai objectFungsi accessorMelindungi stateRangkuman: Meter Parkir2S3 Generics dan Method
Generics dan UseMethodMethod DefaultMethod untuk Base GenericsDasar-Dasar NextMethodRekap: Luas Bangun5S4 class
Mendefinisikan class S4Slots dan AksesPemeriksaan ValiditasMethod showRingkasan: Katalog Produk8Kelas Referensi
Mendefinisikan Kelas ReferensiPembaruan method dan fieldSemantik PenyalinanPewarisan dan callSuperRangkuman: Antrean Tugas11Proyek: Manajemen Perpustakaan
Buku dan AnggotaMeminjam BukuLatihan sendiri: Compiler R online