函数流程:为什么这个函数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.