Menu
Coddy logo textTech

Metodi di stampa e formattazione

Fa parte della sezione Programmazione orientata agli oggetti del percorso R di Coddy. Lezione 4 di 57.

Quando viene stampato un valore, R chiama la funzione print(). Senza nulla di speciale per la classe, un oggetto S3 viene stampato come la sua lista seguita dall’attributo di classe, il che è difficile da leggere:

m <- structure(list(amount = 9.5, currency = "EUR"), class = "money")
print(m)

Output:

$amount
[1] 9.5

$currency
[1] "EUR"

attr(,"class")
[1] "money"

Un metodo è una funzione denominata generic.class. Quando print() riceve un oggetto della classe money, cerca print.money() e la chiama al suo posto. Un metodo di stampa scrive con cat() e termina con invisible(x), quindi restituisce l’oggetto senza stamparlo una seconda volta:

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() è il metodo generico per trasformare un valore in testo. Un metodo format.money() restituisce il testo invece di stamparlo, così altro codice può inserirlo in una frase e il metodo di stampa può riutilizzarlo:

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 

Un metodo accetta gli stessi argomenti della sua funzione generica. print() e format() sono dichiarate come function(x, ...), quindi anche i loro metodi iniziano con x, .... ... accetta argomenti aggiuntivi, come digits, che chi chiama la funzione può passare. I metodi funzionano ovunque venga chiamata la funzione generica, per esempio all'interno di 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

Sfida

Facile

new_money() in Money.R è fornita. Aggiungi due metodi allo stesso file:

  • format.money(x, ...) restituisce l'importo con due cifre decimali e la valuta: 9.50 EUR.
  • print.money(x, ...) stampa <money 9.50 EUR> su una riga a sé, usando format(), e restituisce invisible(x).

Il codice fornito legge le righe 9.5 EUR, stampa ogni oggetto money, poi stampa list: con tutti gli importi formattati uniti da + .

Il tuo codice va in Money.R. main.R contiene il codice di input/output fornito e non può essere modificato.

Provalo tu

source("Money.R")

# Codice di input/output fornito: lascialo così com'è
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 iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore R online