Если вы не знаете, что происходит, может быть полезно добавить некоторые заявления печати. Давайте добавим несколько заявлений для печати в код - один, прежде чем m
называется, два внутри функции m
, и один после m
называется:
l <- function(x) x + 1
m <- function() {
print(l)
l <- function(x) x * 2
print(l)
l(10)
}
print(l)
# function(x) x + 1
m()
# function(x) x + 1
# function(x) x * 2
# <environment: 0x7f8da5ac3b58>
# [1] 20
print(l)
# function(x) x + 1
Перед m
называется и в верхней части m
, l
является определяется как функция, которая возвращает x+1
. Тем не менее, в пределах m
вы меняете l
на новую функцию, которая возвращает x*2
, как указано в заявке на печать в этой функции. В результате вызов l(10)
возвращает 20. Наконец, как только вы покинете эту функцию, вы вернетесь к исходному определению l
(x+1
), потому что версия x*2
определена только для функции. Понятие функции, только определяемой локально, называется name masking.
В данном примере вы вызываете функцию m() и с функцией m() вы вызываете функцию l() R сначала будет искать в среде функций и будет искать среду, в которой она была вызвана, чтобы там была вторая функция выбирается – The6thSense
Перед вызовом функции функция должна быть определена, поэтому функция вызывается после определения функции – The6thSense