Ответ 1
Обычно, когда обсуждается в контексте R лексического охвата, означает, что свободные переменные в функции (т.е. переменные, которые используются в функции, но не определенные в функции) просматриваются в родительской среде функции, в отличие от среда вызывающего (также называемая родительским фреймом), но в with.default
нет свободных переменных, поэтому пример не иллюстрирует нарушение лексического охвата в этом смысле.
Например, это иллюстрирует лексическое охват:
x <- 1
f <- function() x
g <- function() { x <- 0; f() }
g() # 1
Ответ равен 1, потому что 1 определяется в среде, в которой f
определяется в. Если бы R использовало динамическое масштабирование, а не лексическое определение, то ответ был бы равен 0 (с использованием среды вызывающего). Мы можем рассказать о том, как R может эмулировать динамическое масштабирование следующим образом:
f <- function() eval.parent(quote(x))
g() # 0
ДОБАВЛЕНО:
В комментарии ниже @hadley предположил, что авторы, возможно, ссылались на то, что второй фактический аргумент with.default
не оценивается лексически, и эта интерпретация кажется вероятной. Вместо того, чтобы оцениваться относительно окружающей лексической среды, второй фактический аргумент with.default
считывается в функцию with.default
как выражение, используя substitute
, а затем оценивается относительно первого аргумента с использованием eval
. Существует некоторый вопрос о том, какое определение лексического охвата должно быть таким, как оно редко определяется, даже если оно широко обсуждается, но типичные обсуждения по отношению к R относятся к нему как к обработке свободных переменных. См. Например Джентльмен и Ихака.