2012-05-09 16 views
84

Estoy buscando el reverso de get().En R, ¿cómo obtener el nombre de un objeto después de enviarlo a una función?

Dado el nombre de un objeto, deseo que la cadena de caracteres que representa ese objeto se extraiga directamente del objeto.

ejemplo trivial con foo siendo el marcador de posición para la función que estoy buscando.

z <- data.frame(x=1:10, y=1:10) 

test <- function(a){ 
    mean.x <- mean(a$x) 
    print(foo(a)) 
    return(mean.x)} 

test(z) 

imprimiría:

"z" 

Mi trabajo alrededor, lo que es más difícil de implementar en mi problema actual es:

test <- function(a="z"){ 
    mean.x <- mean(get(a)$x) 
    print(a) 
    return(mean.x)} 

test("z") 
+20

creo 'deparse (sustituto (...)) 'es lo que buscas después de – Chase

+2

Un mal ejemplo de tener la variable llamada" z "y el parámetro a probar * también * llamado" z "... Imprimir" z "realmente no te dice si lo hiciste correctamente entonces ;-) – Tommy

+0

@Tommy, traté de mejorarlo, pero por favor mejora con editar si lo deseas. –

Respuesta

104

El viejo deparse sustituto truco:

a<-data.frame(x=1:10,y=1:10) 
test<-function(z){ 
    mean.x<-mean(z$x) 
    nm <-deparse(substitute(z)) 
    print(nm) 
    return(mean.x)} 

test(a) 
#[1] "a" ... this is the side-effect of the print() call 
#   ... you could have done something useful with that character value 
#[1] 5.5 ... this is the result of the function call 

Editar: Funcionó con los nuevos tes t-objeto

Nota: esto no va a tener éxito dentro de una función local cuando un conjunto de elementos de la lista se pasan a lapply Usted haría (y también falla cuando se pasa un objeto de una lista dada a un -loop for). ser capaz de extraer el atributo .Names y el orden de procesamiento del resultado de la estructura, si fuera un vector nombrado que se estaba procesando.

> lapply(list(a=4,b=5), function(x) {nm <- deparse(substitute(x)); strsplit(nm, '\\[')}) 
$a 
$a[[1]] 
[1] "X" ""  "1L]]" 


$b 
$b[[1]] 
[1] "X" ""  "2L]]" 

> lapply(c(a=4,b=5), function(x) {nm <- deparse(substitute(x)); strsplit(nm, '\\[')}) 
$a 
$a[[1]] 
[1] "structure(c(4, 5), .Names = c(\"a\", \"b\"))" ""            
[3] "1L]]"           


$b 
$b[[1]] 
[1] "structure(c(4, 5), .Names = c(\"a\", \"b\"))" ""            
[3] "2L]]" 
2

Tenga en cuenta que para los métodos de impresión el comportamiento puede ser diferente.

print.foo=function(x){ print(deparse(substitute(x))) } 
test = list(a=1, b=2) 
class(test)="foo" 
#this shows "test" as expected 
print(test) 

#this shows 
#"structure(list(a = 1, b = 2), .Names = c(\"a\", \"b\"), class = \"foo\")" 
test 

Otros comentarios que he visto en foros sugieren que el último comportamiento es inevitable. Esto es desafortunado si está escribiendo métodos de impresión para paquetes.

+0

Quizás debería ser: 'print.foo = function (x) {cat (deparse (substitute (x)))}' o 'print.foo = function (x) {print (deparse (substitute (x)), quote = FALSE)} ' –

+0

O' print.foo = function (x) {print.default (as.list (x))} ' –

1
deparse(quote(var)) 

Mi comprensión intuitiva En el que la cita congelar la var o expresión de la evaluación y la función deparse que es la inversa de la función de análisis hace que el símbolo freezed de nuevo a cadena

Cuestiones relacionadas