ОБНОВЛЕНИЕ R-lang определяет environment
как имеющий кадр .Я склонен думать о кадрах как стековые кадры , а не как отображение от имени к значению - но, конечно, есть data.frame
, который отображает имена столбцов на векторы (а затем и на некоторые ...).Я думаю, что большая часть путаницы проистекает из того факта, что исходный S-язык (и до сих пор S-Plus) не имел объектов среды, поэтому все «фреймы» были, по сути, объектами среды сейчас, за исключением того, что они могли существовать только как частьстека вызовов.
Например, в S-Plus документ для sys.nframe
говорит "sys.nframe возвращает числовой индекс текущего кадра в списке всех кадров." ... для меня это звучит очень похоже на кадры стека ... Вы можете узнать больше о кадрах стека здесь: http://en.wikipedia.org/wiki/Call_stack#Structure
Я расширил некоторые объяснения ниже и использую термин "кадр стека "последовательно (надеюсь).
END UPDATE
Я бы объяснил их так:
AnОкружение - это объект, который отображает имена переменных в значения.Каждое отображение называется привязкой.Значение может быть либо реальным, либо обещанием.Среда имеет родительскую среду (кроме пустой среды).Когда вы ищете символ в среде, но он не найден, родительские среды также ищутся.
Обещание - это неоцененное выражение и среда, в которой можно оценить выражение,Когда обещание оценивается, оно заменяется сгенерированным значением.
Закрытие - это функция и среда, в которой была определена функция. Такая функция, как lm
, будет иметь статистикуСреда пространства имен и пользовательская функция будут иметь глобальную среду, но функция f
, определенная в другой функции g
, будет иметь локальную среду для g
в качестве своей среды.
Кадр стека (или запись активации) - это то, что представляет записи в стеке вызовов.Каждый кадр стека имеет локальную среду, в которой выполняется функция, и выражение вызова функции (так, чтобы sys.call
работало).
Когда выполняется вызов функции, локальная средасоздается с его родителем, установленным в среду замыкания, аргументы сопоставляются с формальными аргументами функции, и эти привязки добавляются в локальную среду (как обещания).Несовпадающим формальным аргументам присваиваются значения по умолчанию (обещания) функции (если есть) и помечаются как отсутствующие.Затем создается стековый фрейм с этой локальной средой и выражением вызова.Кадр стека помещается в стек вызовов, а затем тело функции оценивается в этой локальной среде.
... поэтому все символы в теле будут просматриваться влокальная среда (формальные аргументы и локальные переменные), и если она не найдена в родительской среде (которая является средой замыкания) и родительской среде родителя и т. д., пока не будет найдена.
Обратите внимание, что среда фрейма стека родителя НЕ искали в этом случае.Функции 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)