2013-09-21 8 views
8

Il titolo non è super descrittivo in quanto il problema è più lungo di un titolo ragionevole che potrei pensare di visualizzare.Afferrare i nomi degli oggetti da una funzione

Desidero avere una funzione che acquisisce nomi di oggetti da altre funzioni che possono essere utilizzate come argomenti in un'altra funzione. Ecco un tentativo di barebone:

grab <- function(x) { 
    as.character(substitute(x)) 
} 

FUN <- function(foo, bar = grab(foo)) { 
    bar 
} 

FUN(mtcars) 

Ecco voglio FUN per restituire la stringa di caratteri "mtcars" ma restituisce "foo". Come si può fare una funzione di grab che fa questo (voglio farlo perché sto andando a usare questo come predefinito per un file txt/csv etc .È un'impostazione di convenienza

Ecco alcuni tentativi non riusciti (ma voglio avere una funzione grab generica):

FUN2 <- function(foo, bar = as.character(substitute(bar))) { 
    bar 
} 

FUN2(mtcars) 

#================== 

FUN3 <- function(foo, bar) { 
    if(missing(bar)) bar <- foo 
    as.character(substitute(bar)) 
} 

FUN3(mtcars) 

ish vita reale esempio:

real_example <- function(obj, file = grab(obj)) { 
    write.csv(obj, file = sprintf("%s.csv", file)) 
} 
+0

Sentiti libero di modificare o modificare il titolo per renderlo più chiaro. –

+0

Questa domanda sembra molto simile: http://stackoverflow.com/questions/5754367/using-substitute-to-get-argument-name-with – Frank

+0

@Frank hai risposto a una di quelle risposte? –

risposta

6

Si potrebbe provare sys.call di ottenere l'accesso alla chiamata genitore:

## "which" is the number of the argument of interest 
grab <- function(which) { 
    ## which + 1, because [1] == name of function/call 
    ## and arguments are 2:n 
    as.character(sys.call(-1L)[which+1L]) 
} 

FUN <- function(foo, bar = grab(1L)) { 
    bar 
} 

FUN(mtcars) 
# "mtcars" 
+0

Questo è il comportamento che sto cercando. Continuerò a controllare come risposta nel caso in cui gli altri abbiano un'opzione migliore (ad es. Qualcuno indica qualcosa che non funziona). –

+0

+1. Sì, come dice Tyler, se non c'è niente di sbagliato nel farlo in questo modo (invece di passare il nome "mtcars" e usare 'get'), potrei usare anche questo. – Frank

6

Che ne dici di questo?

grab <- function(x) as.character(x[["foo"]]) 
FUN <- function(foo, bar=grab(match.call())) { bar } 

FUN(mtcars) 
# [1] "mtcars" 
+0

Anche questo funziona. +1 –

Problemi correlati