2014-06-19 15 views
9

I impilato con il tentativo di passare la variabile attraverso poche funzioni, e sulla funzione finale voglio ottenere il nome della variabile originale. Ma sembra che la funzione sostitutiva in R guardasse solo in ambiente "locale", o solo per un livello superiore. Beh, mi permetta di spiegare che per codice:Come ottenere il nome della variabile in R (sostituto)?

fun1 <- function (some_variable) {deparse(substitute(some_variable)} 
fun2 <- function (var_pass) { fun1 (var_pass) } 
my_var <- c(1,2) # I want to get 'my_var' in the end 
fun2 (my_var) # > "var_pass" 

Beh, sembra che abbiamo la stampa del nome della variabile che passa solo al fun1. La documentazione del sostituto ci dice che possiamo usare l'argomento env per specificare dove possiamo guardare. Ma passando Globale o .BaseNamespaceEnv come argomento per sostituire ho avuto ancora più strani risultati - "some_variable"

Credo che la risposta è in questa funzione con l'utilizzo di argomento env, così, la prego di spiegare come funziona e come posso ottenere ciò di cui ho bisogno. Grazie in anticipo!

+0

Abbastanza sicuro che "The R-Inferno" tocca questo. A proposito, suppongo che volevi chiamare 'fun1' all'interno di' fun2' con 'var_pass'? –

+0

Oh, grazie! Sì, intendevo fun1 (var_pass). – EvilAnton

+0

Perché hai bisogno del nome in primo luogo. C'è probabilmente un'alternativa buona e più semplice. –

risposta

9

Ti suggerisco di considerare di passare il valore del nome opzionale a queste funzioni. Dico questo perché sembra che tu voglia davvero usare il nome come etichetta per qualcosa nel risultato finale; quindi non è proprio la variabile stessa che conta tanto quanto il suo nome. Si potrebbe fare

fun1 <- function (some_variable, name=deparse(substitute(some_variable))) { 
    name 
} 
fun2 <- function (var_pass, name=deparse(substitute(var_pass))) { 
    fun1 (var_pass, name) 
} 
my_var <- c(1,2) 

fun2(my_var) 
# [1] "my_var" 

fun1(my_var) 
# [1] "my_var" 

questo modo, se si finisce per avere un po 'strano nome di variabile e cosa dare un nome migliore per un risultato, almeno ha la possibilità. E per impostazione predefinita dovrebbe fare quello che vuoi senza dover richiedere il parametro name.

+0

Questo è interessante!)) Ma il problema penso nella R stessa. Vorrei anche nel parametro init() per aggiungere il nome, ma come ho già detto, non è il modo comodo con data.frames – EvilAnton

+1

Non riesco a citare il tuo commento @EvilAnton. Non sono sicuro di cosa sia il passo 'init()' o di come questo si riferisca specificamente a data.frames. Se vuoi usare 'nome' per estrarre una colonna da un dato.frame, puoi usare 'df [, name]' se il valore in 'name' corrisponde esattamente a uno dei nomi di colonna. – MrFlick

+0

Inizialmente intendevo. Quando carichi tutti i dati nello spazio di lavoro. Ma in realtà hai fatto un buon punto. Se rinominare alcuni nomi di colonna che dovrebbe funzionare. – EvilAnton

0

Un hack, probabilmente non è il modo migliore:

fun2 <- function (var_pass) { fun1 (deparse(substitute(var_pass))) } 

fun1 <- function (some_variable) {(some_variable))} 

fun2(my_var) 
# "my_var" 

E si potrebbe correre get su questo. Ma come suggerisce Paul H, ci sono modi migliori per tenere traccia delle variabili.

+0

Se qualcuno può guidarmi dove cercare per trovare il modo migliore, lo apprezzerei molto :) – EvilAnton

+0

Beh, un modo per vedere che cosa è successo è passare sempre tutto il tempo attraverso le funzioni e usare get() . Ma non mi sembra buono, almeno dal modo di programmare l'architettura. – EvilAnton