功能流程:为什么这个功能返回20

时间:2015-06-04 12:56:44

标签: r function scoping

假设我有一个名为l的函数:

l <- function(x) x + 1

然后定义另一个函数m,但在m内,重新定义l

m <- function() {
       l <- function(x) x*2
       l(10)
}
m()

为什么m会返回x*2而不是x+1

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