En R, ¿cómo obtener el nombre de un objeto después de enviarlo a una función?

Estoy buscando el reverso de get() .

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, 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") 

El viejo truco de deparse-substituto:

 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: lo ejecutó con el nuevo objeto de prueba

Nota: esto no tendrá éxito dentro de una función local cuando se pase un conjunto de elementos de la lista a lapply (y también falla cuando se pasa un objeto desde una lista asignada a a for -loop). Usted podría extraer los .Names atributo y el orden de procesamiento del resultado de la estructura, si se tratara de 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]]" 

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.

 deparse(quote(var)) 

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