Как связаны окружения, (en) замыкания и фреймы? - PullRequest
14 голосов
/ 26 октября 2011

Я хочу лучше понять, как связаны окружения , замыкания и кадры Я понимаю, что замыкания функций содержат среду, среды содержат фрейм и оболочку, а фреймы содержат переменные, но я немного не уверен, как они взаимодействуют друг с другом.вызов функции поможет?Или, может быть, диаграмма?

Ответы [ 2 ]

10 голосов
/ 27 октября 2011

ОБНОВЛЕНИЕ R-lang определяет environment как имеющий кадр .Я склонен думать о кадрах как стековые кадры , а не как отображение от имени к значению - но, конечно, есть data.frame, который отображает имена столбцов на векторы (а затем и на некоторые ...).Я думаю, что большая часть путаницы проистекает из того факта, что исходный S-язык (и до сих пор S-Plus) не имел объектов среды, поэтому все «фреймы» были, по сути, объектами среды сейчас, за исключением того, что они могли существовать только как частьстека вызовов.

Например, в S-Plus документ для sys.nframe говорит "sys.nframe возвращает числовой индекс текущего кадра в списке всех кадров." ... для меня это звучит очень похоже на кадры стека ... Вы можете узнать больше о кадрах стека здесь: http://en.wikipedia.org/wiki/Call_stack#Structure

Я расширил некоторые объяснения ниже и использую термин "кадр стека "последовательно (надеюсь).

END UPDATE

Я бы объяснил их так:

  1. AnОкружение - это объект, который отображает имена переменных в значения.Каждое отображение называется привязкой.Значение может быть либо реальным, либо обещанием.Среда имеет родительскую среду (кроме пустой среды).Когда вы ищете символ в среде, но он не найден, родительские среды также ищутся.

  2. Обещание - это неоцененное выражение и среда, в которой можно оценить выражение,Когда обещание оценивается, оно заменяется сгенерированным значением.

  3. Закрытие - это функция и среда, в которой была определена функция. Такая функция, как lm, будет иметь статистикуСреда пространства имен и пользовательская функция будут иметь глобальную среду, но функция f, определенная в другой функции g, будет иметь локальную среду для g в качестве своей среды.

  4. Кадр стека (или запись активации) - это то, что представляет записи в стеке вызовов.Каждый кадр стека имеет локальную среду, в которой выполняется функция, и выражение вызова функции (так, чтобы sys.call работало).

  5. Когда выполняется вызов функции, локальная средасоздается с его родителем, установленным в среду замыкания, аргументы сопоставляются с формальными аргументами функции, и эти привязки добавляются в локальную среду (как обещания).Несовпадающим формальным аргументам присваиваются значения по умолчанию (обещания) функции (если есть) и помечаются как отсутствующие.Затем создается стековый фрейм с этой локальной средой и выражением вызова.Кадр стека помещается в стек вызовов, а затем тело функции оценивается в этой локальной среде.

... поэтому все символы в теле будут просматриваться влокальная среда (формальные аргументы и локальные переменные), и если она не найдена в родительской среде (которая является средой замыкания) и родительской среде родителя и т. д., пока не будет найдена.

Обратите внимание, что среда фрейма стека родителя НЕ искали в этом случае.Функции parent.frame, sys.frame получают среды в стеке вызовов, то есть среду вызывающей стороны и среду вызывающей стороны и т. Д. *

# Here match.fun needs to look in the caller's caller's environment to find what "x" is...
f <- function(FUN) match.fun(FUN)(1:10)
g <- function() { x=sin; y="x"; f(y) }
g() # same as sin(1:10)

# Here we see that the stack frames must also contain the actual call expression
f <- function(...) sys.call()
g <- function(...) f(..., x=42)
g(a=2) # f(..., x = 42)
5 голосов
/ 26 октября 2011

Имеет ли это расширенное описание Джона Фокса ответы на ваши вопросы?

В нем есть хорошие диаграммы, но нет пони.

Также есть описание в Книга Фокса и Вайсберга "Компаньон R в прикладной регрессии" (2011) , начиная с с.417 или раздел 8.9.1.Я думаю, что вышеупомянутый PDF, хотя и более старый, вероятно, столь же информативен, если не больше (из-за диаграмм).F & W - хорошая книга, которую я включил пару раз прежде, для других полезных вещей .FWIW, я не нашел полезных идей в книге «R in Nutshell».У меня пока нет книг Чамберса.

...