假設我有一個叫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
?
假設我有一個叫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
?
如果您不確定發生了什麼,可以添加一些打印語句。讓我們添加一些打印語句代碼 - 一個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。
很好的例子。 –
非常感謝...也可以使用我的環境:0x7f8 ...輸出是所有關於,我想嘗試相同的打印和調試的東西,它不斷彈出而不是價值? –
@VinayakBakshi這表明函數是在'm'內而不是在全局環境中定義的。如果您對R中有關環境的更多細節感興趣,可以找到[優秀資源](http://adv-r.had.co.nz/Environments.html)。 – josliber
在給出的示例中,您正在調用函數m(),並在函數m()中調用函數l()R將首先在函數環境中搜索,並將搜索調用該函數的環境,被選中 – The6thSense
在調用函數之前,必須定義函數,這就是爲什麼在函數定義後調用函數的原因。 – The6thSense