In R, come ottenere il nome di un object dopo che è stato inviato a una funzione?

Sto cercando il contrario di get() .

Dato un nome object, desidero avere la stringa di caratteri che rappresenta quell’object estratto direttamente dall’object.

Esempio banale con foo che funge da segnaposto per la funzione che sto cercando.

 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) 

Stamperebbe:

  "z" 

Il mio lavoro, che è più difficile da attuare nel mio attuale problema, è:

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

Il vecchio trucco sostitutivo:

 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 

Modifica: eseguito con il nuovo object di prova

Nota: questo non avrà successo all'interno di una funzione locale quando un set di elementi di lista viene passato a lapply (e fallisce anche quando un object viene passato da un elenco dato a un for -loop). Sarai in grado di estrarre i nomi. attributo e l'ordine di elaborazione dal risultato della struttura, se si trattasse di un vettore con nome elaborato.

 > 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]]" 

Si noti che per i metodi di stampa il comportamento può essere diverso.

 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 

Altri commenti che ho visto su forum suggeriscono che l’ultimo comportamento è inevitabile. Questo è un peccato se si scrivono i metodi di stampa per i pacchetti.

 deparse(quote(var)) 

La mia comprensione intuitiva In cui la citazione blocca la var o espressione dalla valutazione e la funzione deparse che è l’inverso della funzione parse rende di nuovo il simbolo congelato a String