2015-04-14 6 views
8

Ho esaminato le altre domande con scope lessicale in R e non riesco a trovare la risposta. Considerate questo codice:Quando è impostato Lexical Scope per una funzione all'interno di una funzione?

f <- function(x) { 
    g <- function(y) { 
    y + z 
    } 
    z <- 4 
    x + g(x) 
} 
f(3) 

f(3) restituirà una risposta di 10. La mia domanda è: perché? Nel punto g() definito nel codice, z non è stato assegnato alcun valore. A che punto è stata creata la chiusura per g()? "Guarda avanti" al resto del corpo della funzione? Viene creato quando viene valutato lo g(x)? Se è così, perché?

+4

Potrebbe aiutare le persone a spiegare se hai detto quale valore ti aspettavi diverso da 10 – joran

+0

Nota che in una nuova sessione, 'f <- function (x) {y}' definirà 'f' senza problemi. A R non importa cosa c'è dentro f finché non viene chiamato. –

risposta

10

Quando viene eseguito f, la prima cosa che accade è che viene creata una funzione g nell'ambiente locale di f. Successivamente, la variabile z viene creata per assegnazione.

Infine, viene aggiunto al risultato di g(x) e restituito. Nel momento in cui viene chiamato g(x), x = 3 e g esiste nell'ambiente locale di f. Quando si incontra la variabile libera z durante l'esecuzione di g(x), R cerca nell'ambiente successivo in su, l'ambiente di chiamata, che è l'ambiente locale di f. Essa trova z lì e procede, tornando 7. Quindi aggiunge questo per x quali è 3.

(Dal momento che questa risposta sta attirando maggiore attenzione, devo aggiungere che la mia lingua era un po 'allentato quando si parla di ciò che x "eguali "in vari punti che probabilmente non riflettono accuratamente la valutazione ritardata di R degli argomenti xsarà uguale a 3 una volta che il valore è necessario.)

Problemi correlati