Чтобы увидеть, что происходит, давайте определим функцию следующим образом:
adderGen <- function(){
print("Initialize")
x <- 0
function() {x <<- x+1; x}
}
Когда мы ее оценим, мы получим:
adder <- adderGen()
# [1] "Initialize"
Объект, который был назначен adder
- это внутренняя функция adderGen
(которая является выходом adderGen
). Обратите внимание, что adder
больше не печатает "Initialize"
.
adderGen
# function(){
# print("Initialize")
# x <- 0
# a <- function() {x <<- x+1; x}
# }
adder
# function() {x <<- x+1; x}
# <environment: 0x55cd4ebd3390>
Мы видим, что он также создает новую вызывающую среду, которая наследует переменную x
в среде adderGen
.
ls(environment(adder))
# [1] "x"
get("x",environment(adder))
# [1] 0
При первом выполнении adder
он использует унаследованное значение x
, то есть 0, чтобы переопределить x
как глобальную переменную (в своей вызывающей среде). И эта глобальная переменная будет использоваться в следующих исполнениях. Поскольку x <-0
не является частью функции adder
, при выполнении adder
переменная x
не инициализируется значением 0 и увеличивает на единицу текущее значение x
.
adder()
# [1] 1