Menu
Coddy logo textTech

Metodi show

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

Quando viene stampato un oggetto S4, R chiama la funzione show(). Senza un metodo per la classe, elenca ogni slot: è corretto, ma prolisso:

setClass("Point", slots = c(x = "numeric", y = "numeric"))
p <- new("Point", x = 1, y = 2)
p

Output:

An object of class "Point"
Slot "x":
[1] 1

Slot "y":
[1] 2

setMethod("show", "Point", function(object) ...) assegna alla classe un proprio metodo di stampa. Il metodo stampa con cat() e viene usato sia quando un oggetto viene stampato al livello superiore, sia da print():

setClass("Point", slots = c(x = "numeric", y = "numeric"))
setMethod("show", "Point", function(object) {
  cat("Point(", object@x, ", ", object@y, ")\n", sep = "")
})
p <- new("Point", x = 1, y = 2)
p
print(p)

Output:

Point(1, 2)
Point(1, 2)

Uno slot può contenere un altro oggetto S4: dichiara il suo tipo usando il nome della classe. Il metodo show() esterno può stampare l'oggetto interno chiamando show() su di esso:

setClass("Point", slots = c(x = "numeric", y = "numeric"))
setMethod("show", "Point", function(object) cat("(", object@x, ", ", object@y, ")", sep = ""))
setClass("Line", slots = c(from = "Point", to = "Point"))
setMethod("show", "Line", function(object) {
  cat("line ")
  show(object@from)
  cat(" -> ")
  show(object@to)
  cat("\n")
})
new("Line", from = new("Point", x = 0, y = 0), to = new("Point", x = 3, y = 4))

Output:

line (0, 0) -> (3, 4)

Una classe virtuale, dichiarata con representation("VIRTUAL"), non può essere creata con new(). Esiste per fungere da genitore comune per altre classi, su cui si basa il capitolo sull'ereditarietà S4. isVirtualClass() distingue i due tipi:

setClass("Shape", representation("VIRTUAL"))
setClass("Point", slots = c(x = "numeric"))
cat(isVirtualClass("Shape"), isVirtualClass("Point"), "\n")
msg <- tryCatch(new("Shape"), error = function(e) "cannot create a Shape")
cat(msg, "\n")

Output:

TRUE FALSE 
cannot create a Shape 
challenge icon

Sfida

Facile

Punti e segmenti sono due classi S4 in due file. Le classi sono dichiarate. Aggiungi i loro metodi show():

  • In Point.R: un punto viene stampato come Point(1, 2) seguito da una nuova riga.
  • In Segment.R: un segmento viene stampato come Segment Point(1, 2) to Point(4, 6), length 5 seguito da una nuova riga, con la lunghezza arrotondata a due decimali. Crea tu il testo del punto oppure usa una funzione di supporto; il metodo del punto stampa una propria nuova riga, quindi non chiamarlo nel mezzo della riga del segmento.

Il codice fornito legge le righe 1,2 4,6, stampa il primo punto e poi il segmento, entrambi tramite i rispettivi metodi show().

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

Provalo tu

source("Point.R")
source("Segment.R")

# Código de entrada/salida proporcionado: déjalo tal como está
input <- suppressWarnings(readLines(file("stdin")))
for (line in input) {
  n <- as.numeric(strsplit(line, "[ ,]")[[1]])
  a <- new("Point", x = n[1], y = n[2])
  b <- new("Point", x = n[3], y = n[4])
  print(a)
  print(new("Segment", from = a, to = b))
}
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