2012-06-07 5 views
22

Ho bisogno di un po 'di aiuto con il gergo e un breve pezzo di codice di esempio. Diversi tipi di oggetti hanno un modo specifico di emettere se stessi quando scrivi il nome dell'oggetto e premi invio, un oggetto lm mostra un riepilogo del modello, un vettore elenca i contenuti del vettore.Esempio necessario: modifica del metodo di stampa predefinito di un oggetto

Mi piacerebbe essere in grado di scrivere a modo mio per "mostrare" il contenuto di un tipo specifico di oggetto. Idealmente, mi piacerebbe essere in grado di separare questo da tipi di oggetti esistenti.

Come faccio a fare questo?

+1

Forse vedere '? Metodi' - ci sono esempi nella parte inferiore della pagina. – BenBarnes

+1

Fai attenzione se stai provando ad alterare il metodo di stampa di un oggetto di classe S3 fornito da un pacchetto con un NAMESPACE, ovvero tutti i pacchetti con una versione moderna di R. Se scrivi un nuovo metodo 'print()' per un esistente classe, potrebbe essere necessario 'assignInNamespace (....)' la versione locale del metodo di stampa. –

+0

Grazie per la direzione Ben e la punta Gavin. –

risposta

25

Ecco un esempio per iniziare. Una volta ottenuta l'idea di base su come vengono inviati i metodi S3, dai uno sguardo ai metodi di stampa restituiti da methods("print") per vedere come è possibile ottenere stili di stampa più interessanti.

## Define a print method that will be automatically dispatched when print() 
## is called on an object of class "myMatrix" 
print.myMatrix <- function(x) { 
    n <- nrow(x) 
    for(i in seq_len(n)) { 
     cat(paste("This is row", i, "\t: ")) 
     cat(x[i,], "\n") 
     } 
} 

## Make a couple of example matrices 
m <- mm <- matrix(1:16, ncol=4) 

## Create an object of class "myMatrix". 
class(m) <- c("myMatrix", class(m)) 
## When typed at the command-line, the 'print' part of the read-eval-print loop 
## will look at the object's class, and say "hey, I've got a method for you!" 
m 
# This is row 1 : 1 5 9 13 
# This is row 2 : 2 6 10 14 
# This is row 3 : 3 7 11 15 
# This is row 4 : 4 8 12 16 

## Alternatively, you can specify the print method yourself. 
print.myMatrix(mm) 
# This is row 1 : 1 5 9 13 
# This is row 2 : 2 6 10 14 
# This is row 3 : 3 7 11 15 
# This is row 4 : 4 8 12 16 
+0

Esattamente quello di cui avevo bisogno. La mia lingua era del tutto errata "type" = "class", "way of outputting" = "method" –

+0

Il punto di mm era di mostrare che l'oggetto non doveva essere di classe "myMatrix" per la funzione di stampa a lavoro? –

+0

Sì. Fondamentalmente l'ho incluso per aiutare a demistificare l'intero argomento, e per mostrare che 'print.myMatrix' è solo un'altra funzione che può essere applicata a qualsiasi oggetto. L'unica cosa speciale è la parte '.myMatrix' del suo nome, che permette di trovarla con la chiamata' UseMethod' che viene invocata quando viene valutata una chiamata a 'print()'. Non sono sicuro di quanto successo avesse, ma quello era il mio intento. –

Problemi correlati