函数流程:为什么这个函数return20
Function flow: why does this function return 20
假设我有一个名为 l
:
的函数
l <- function(x) x + 1
然后定义另一个函数,m
,但是在m
内,重新定义l
:
m <- function() {
l <- function(x) x*2
l(10)
}
m()
为什么 m
return x*2
而不是 x+1
?
如果您不确定发生了什么,添加一些打印语句可能会有所帮助。让我们在您的代码中添加一些打印语句——一个在 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
被定义为returnsx+1
的函数。但是,在 m
中,您将 l
更改为一个新函数,即 returns x*2
,如该函数中的第二个打印语句所示。结果,调用 l(10)
returns 20。最后,一旦你离开那个函数,你就会回到原来的 l
定义(x+1
),因为 x*2
版本仅为函数定义。仅在本地定义函数的概念称为 name masking.
假设我有一个名为 l
:
l <- function(x) x + 1
然后定义另一个函数,m
,但是在m
内,重新定义l
:
m <- function() {
l <- function(x) x*2
l(10)
}
m()
为什么 m
return x*2
而不是 x+1
?
如果您不确定发生了什么,添加一些打印语句可能会有所帮助。让我们在您的代码中添加一些打印语句——一个在 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
被定义为returnsx+1
的函数。但是,在 m
中,您将 l
更改为一个新函数,即 returns x*2
,如该函数中的第二个打印语句所示。结果,调用 l(10)
returns 20。最后,一旦你离开那个函数,你就会回到原来的 l
定义(x+1
),因为 x*2
版本仅为函数定义。仅在本地定义函数的概念称为 name masking.