2011-02-10 12 views
13

definir un objeto de la clase S3 "bar" y un método de impresión:Obtener el nombre del objeto para el método de impresión S3 no

foo=list(1) 
class(foo) <- c("bar") 
print.bar <- function(x,...){ 
    cat("print.bar says this was ",deparse(substitute(x)),"\n") 
} 

Ahora imprima (foo) hace esto:

> print(foo) 
print.bar says this was foo 

Grande, pero auto-impresión no funciona:

> foo 
print.bar says this was structure(list(1), class = "bar") 

supongo que esto es algo que ver con la forma en que la línea se evalúa como una expresión de nivel superior. Tuve una búsqueda rápida en R-devel inútilmente. ¿Alguien sabe como arreglarlo?

La razón por la que quiero el nombre es porque lo que estoy definiendo es una función, y quiero poner 'try foo (2)' en el método de impresión (obteniendo 'foo' del nombre del objeto). Sí, puede subclasificar funciones en S3. Supongo que puede haber otras pantallas.

Respuesta

8

Este es un caso muy especial, como R sustituye foo por su valor antes de llamar al print cuando escribe el nombre en la línea de comando. Esto puede ilustrarse por:

foo=list(1) 
class(foo) <- c("bar") 
print.bar <- function(x,...){ 
    print(sys.calls()) 
} 

> foo 
[[1]] 
print(list(1)) 

[[2]] 
print.bar(list(1)) 

> print(foo) 
[[1]] 
print(foo) 

[[2]] 
print.bar(foo) 

ergo, sin el nombre como un atributo (como Aaron mostró), no hay manera en la tierra se le extrae el nombre del objeto desde cualquier lugar. Simplemente no está allí en la pila de llamadas.

+0

Sí, parece que no se puede hacer. Podría echar un vistazo a la fuente para ver exactamente cómo sucede esto. ¡Gracias! – Spacedman

5

Si no va a cambiar el nombre del objeto, podría incluir el nombre como atributo e imprimirlo en su lugar.

foo <- structure(list(1), class="bar", name="foo") 
print.bar <- function(x,...){ 
    cat("print.bar says this was",attr(x, "name"),"\n") 
} 

A continuación, se hace lo que espera:

> print(foo) 
print.bar says this was foo 
> foo 
print.bar says this was foo 

A menos que utilice un nombre diferente para el mismo objeto:

> fooX <- foo 
> fooX 
print.bar says this was foo 
Cuestiones relacionadas