Menu
CoddyTech

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)
m

Output:

<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"
challenge icon

Tantangan

Mudah

new_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, menggunakan format(), dan mengembalikan invisible(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 = "")
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Object

Latihan sendiri: Compiler R online