2012-05-09 6 views
84

Sto cercando il retro di get().In R, come ottenere il nome di un oggetto dopo che è stato inviato a una funzione?

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

Esempio banale con foo essere il 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 intorno, che è più difficile da implementare nel mio problema attuale è:

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

test("z") 
+20

penso 'Deparse (sostituto (...)) 'è ciò che si sta cercando – Chase

+2

Esempio errato per avere la variabile chiamata" z "e il parametro per testare * anche * chiamato" z "... La stampa" z "in realtà non dice se lo hai fatto correttamente quindi ;-) – Tommy

+0

@ Tommy, hai provato a migliorarlo, ma per favore migliora con la modifica se lo desideri. –

risposta

104

Il vecchio Deparse-sostituto trucco:

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: l'ho provato con i nuovi tes t-oggetto

Nota: questo non avrà successo all'interno di una funzione locale quando una serie di voci di elenco vengono passati al lapply Si farebbe (e fallisce anche quando un oggetto viene passato da un elenco dato ad un for -loop.) essere in grado di estrarre l'attributo .Names 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]]" 
2

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 sui forum suggeriscono che l'ultimo comportamento è inevitabile. Questo è un peccato se si scrivono i metodi di stampa per i pacchetti.

+0

Forse dovrebbe essere: 'print.foo = function (x) {cat (deparse (sostituto (x)))}' o 'print.foo = function (x) {print (deparse (sostituto (x)), preventivo = FALSE)} ' –

+0

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

1
deparse(quote(var)) 

mia comprensione intuitiva In cui la citazione congelare la var o l'espressione dalla valutazione e la funzione Deparse che è l'inverso della funzione di analisi rende quel simbolo freezed torna a String

Problemi correlati