2012-06-07 4 views
22

Necesito un poco de ayuda con la jerga, y un pequeño fragmento de código de ejemplo. Los diferentes tipos de objetos tienen una forma específica de mostrarse solos cuando se escribe el nombre del objeto y se presiona enter, un objeto lm muestra un resumen del modelo, un vector enumera los contenidos del vector.necesario: Cambiar el método de impresión por defecto de un objeto

me gustaría ser capaz de escribir mi propio camino para "mostrar" el contenido de un determinado tipo de objeto. Idealmente, me gustaría poder separar esto de los tipos existentes de objetos.

¿Cómo voy a ir haciendo esto?

+1

Quizás vea '? Métodos' - hay ejemplos cerca de la parte inferior de la página. – BenBarnes

+1

Tenga cuidado si está intentando modificar el método de impresión de un objeto de clase S3 provisto por un paquete con NAMESPACE, que son todos los paquetes con una versión moderna de R. Si escribe un nuevo método 'print()' para un existente clase, es posible que deba 'assignInNamespace (....)' su versión local del método de impresión. –

+0

Gracias por la dirección Ben y el consejo Gavin. –

Respuesta

25

He aquí un ejemplo para que pueda empezar. Una vez que obtenga la idea básica de cómo se envían los métodos S3, eche un vistazo a cualquiera de los métodos de impresión devueltos por methods("print") para ver cómo puede lograr estilos de impresión más interesantes.

## 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

Exactamente lo que necesitaba. Mi lenguaje era incorrecto "type" = "class", "way of outputting" = "method" –

+0

El objetivo de mm era mostrarme que el objeto no tenía que ser de la clase "myMatrix" para que la función de impresión ¿trabajo? –

+0

Sí. Básicamente lo incluí para ayudar a desmitificar todo el tema, y ​​para mostrar que 'print.myMatrix' es simplemente otra función que podría aplicarse a cualquier objeto. Lo único especial es la parte '.myMatrix' de su nombre, que permite que se encuentre con la llamada' UseMethod' invocada cuando se evalúa una llamada a 'print()'. No estoy seguro de lo exitoso que fue, pero esa fue mi intención. –

Cuestiones relacionadas