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

135

Estoy buscando el reverso de get().

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

Ejemplo trivial de fooser 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")
Etienne Low-Décarie
fuente
35
Creo que deparse(substitute(...))es lo que buscas
Chase
2
Sin embargo, es un mal ejemplo 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
@Tommy, trató de mejorarlo, pero si lo desea, mejore con la edición.
Etienne Low-Décarie
Lo opuesto a geten R es assignpero no estoy seguro de que eso es lo que realmente estás buscando ...
Tom Kelly

Respuestas:

160

El viejo truco de sustitución de sustitución:

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 pasa un conjunto de elementos de la lista desde el primer argumento a lapply(y también falla cuando se pasa un objeto de una lista dada a un forbucle -loop). Podría extraer el El atributo ".Names" y el orden de procesamiento del resultado de la estructura, si se tratara de un vector con nombre.

> 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]]"  
IRTFM
fuente
11
deparse(quote(var))

Mi comprensión intuitiva en la que la cita congela la var o expresión de la evaluación y la función de eliminación que es la inversa de la función de análisis hace que ese símbolo congelado vuelva a String

nubes
fuente
6

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 lamentable si está escribiendo métodos de impresión para paquetes.

Eli Holmes
fuente
Quizás debería ser: print.foo=function(x){ cat(deparse(substitute(x))) }oprint.foo=function(x){ print(deparse(substitute(x)), quote=FALSE) }
IRTFM
1
Oprint.foo=function(x){ print.default(as.list(x)) }
IRTFM