2015-06-04 49 views
1

假設我有一個叫l功能:功能流程:爲什麼這個函數返回20

l <- function(x) x + 1 

然後定義另一個函數,m,但內m,重新定義l

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

爲什麼m返回x*2,而不是x+1

+0

在給出的示例中,您正在調用函數m(),並在函數m()中調用函數l()R將首先在函數環境中搜索,並將搜索調用該函數的環境,被選中 – The6thSense

+0

在調用函數之前,必須定義函數,這就是爲什麼在函數定義後調用函數的原因。 – The6thSense

回答

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,如該函數中的第二個打印語句所示。因此,呼叫l(10)返回20.最後,一旦您離開該功能,您將回到原始的l定義(x+1),因爲x*2版本僅爲該功能定義。僅在本地定義的功能的概念被稱爲name masking

+0

很好的例子。 –

+0

非常感謝...也可以使用我的環境:0x7f8 ...輸出是所有關於,我想嘗試相同的打印和調試的東西,它不斷彈出而不是價值? –

+0

@VinayakBakshi這表明函數是在'm'內而不是在全局環境中定義的。如果您對R中有關環境的更多細節感興趣,可以找到[優秀資源](http://adv-r.had.co.nz/Environments.html)。 – josliber