假设我有一个名为l
的函数:
l <- function(x) x + 1
然后定义另一个函数m
,但在m
内,重新定义l
:
m <- function() {
l <- function(x) x*2
l(10)
}
m()
为什么m
会返回x*2
而不是x+1
?
答案 0 :(得分:5)
如果您不确定发生了什么,添加一些打印报表会很有帮助。我们在您的代码中添加一些打印语句 - 一个在调用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
,如该函数中的第二个print语句所示。因此,调用l(10)
会返回20.最后,当您离开该函数时,您将返回到原始l
定义(x+1
),因为x*2
版本仅定义为功能。仅在本地定义的函数的概念称为name masking。