Другие ответы сосредоточены на том, как заставить outer_func
и inner_func
вести себя так, как вы ожидаете, что они будут вести себя.Я постараюсь показать , почему они этого не делают.
Если вы переопределите inner_func
для печати его родительской среды, вы увидите, что это не среда вызывающего, а глобальная среда.
inner_func <- function(){
print(parent.env(environment()))
a <<- 30
}
Теперь вызовите outer_func
и посмотритечто он пытается найти переменную a
в этой среде, а не в среде outer_func
.
outer_func()
#<environment: R_GlobalEnv>
#[1] 10
И когда вы печатаете a
, после вызова outer_func
он имеет ожидаемыйзначение.
a
#[1] 30
Функция inner_func
не нашла a
, поэтому создала ее в GlobalEnv
.
Сравните вышеприведенное со следующим.A inner_func
определяется в outer_func
.Теперь присваивание <<-
находит a
и меняет его значение.
outer_func2 <- function(){
inner_func <- function(){
print(parent.env(environment()))
a <<- 30
}
a <- 10
inner_func()
print(a)
}
rm(a)
outer_func2()
#<environment: 0xdd06e18>
#[1] 30
Но поскольку outer_func2
не присваивает свое значение, a
не существует в GlobalEnv
.Он был изменен только в outer_func
, единственном месте, где он существует.
a
#Error: object 'a' not found