2015-04-14 8 views
8

Я рассмотрел другие лексические вопросы в области R, и я не могу найти ответ. Рассмотрим этот код:Когда Лексический Сфера для функции в пределах определенной функции?

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

f(3) возвратит ответ 10. Мой вопрос: почему? В точке g() определено в коде, z не присвоено никакого значения. В какой момент создается закрытие для g()? Он «смотрит в будущее» на остальную часть тела функции? Создается ли при оценке g(x)? Если да, то почему?

+4

Это может помочь людям объяснить, если вы сказали, какое значение вы ожидали, кроме 10 – joran

+0

Обратите внимание, что в новом сеансе 'f <- function (x) {y}' будет определять 'f' без проблем. R не заботится о том, что внутри 'f', пока оно не вызвано. –

ответ

10

Когда запущено f, первое, что происходит, это то, что в f создана локальная функция g. Затем переменная z создается путем назначения.

Наконец, x добавлен к результату g(x) и возвращен. В точке, называемой g(x), x = 3 и g существует в локальной среде f. Когда во время выполнения g(x) встречается свободная переменная z, R смотрит в следующую среду вверх, вызывающую среду, которая является локальной средой f. Он находит z там и продолжается, возвращаясь 7. Затем он добавляет это x, которая 3.

(Поскольку этот ответ привлекает больше внимания, я должен добавить, что мой язык был немного свободно, когда речь идет о том, какие x «равных «в разных точках, которые, вероятно, не точно отражают отложенную оценку аргументов R. xбудет равен, равному 3, когда это необходимо.)