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


135

Sto cercando il contrario di get().

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

Esempio fondamentale di fooessere 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)

Stampa:

  "z"

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

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

test("z")

35
Penso che deparse(substitute(...))sia quello che stai cercando
Chase,

2
Cattivo esempio però di avere la variabile chiamata "z" e il parametro da testare chiamato anche "z" ... La stampa di "z" non ti dice davvero se l'hai fatta correttamente allora ;-)
Tommy,

@ Tommy, ho cercato di migliorarlo, ma per favore migliora con modifica se lo desideri.
Etienne Low-Décarie,

L'opposto di getin R è assignma non sono sicuro che sia quello che stai davvero cercando ...
Tom Kelly,

Risposte:


160

Il vecchio trucco deparse-sostituto:

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 oggetto test

Nota: questo non avrà successo all'interno di una funzione locale quando un set di voci di elenco viene passato dal primo argomento a lapply(e fallisce anche quando un oggetto viene passato da un elenco dato a un for-loop.) Sareste in grado di estrarre il ".Names" -attribute e l'ordine di elaborazione dal risultato della struttura, se fosse un vettore denominato che veniva 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]]"  

11
deparse(quote(var))

La mia comprensione intuitiva in cui la citazione congela la var o l'espressione dalla valutazione e la funzione deparse che è l'inverso della funzione di analisi riporta quel simbolo congelato su String


6

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 stai scrivendo metodi di stampa per i pacchetti.


Forse dovrebbe essere: print.foo=function(x){ cat(deparse(substitute(x))) }oprint.foo=function(x){ print(deparse(substitute(x)), quote=FALSE) }
IRTFM

1
Oppureprint.foo=function(x){ print.default(as.list(x)) }
IRTFM,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.