函數(shù)的組成部分
1??函數(shù)體:body(),函數(shù)的代碼
2??形式參數(shù)列表:formals(),控制函數(shù)調(diào)用的參數(shù)列表
3??環(huán)境:environment(),函數(shù)的變量所在位置的“地圖”
> f<-function(x) x^2
> f
function(x) x^2
> formals(f)
$x
> body(f)
x^2
> environment(f)
<environment: R_GlobalEnv>
函數(shù)都有上述三個組成部分,有一個例外:原語函數(shù)(如:sum等),它是直接用.Primitive()調(diào)用C語言代碼,并且不包含R語言代碼。因此它們的formals()、body()、environment()都是NULL
四個基本原則:
名字屏蔽、函數(shù)和變量、全新的開始狀態(tài)、動態(tài)查找
(1)名字屏蔽
a)如果一個名字在函數(shù)中沒有定義,那么R語言將向上一個層次查找。
? ?b)如果一個函數(shù)內(nèi)部定義了另一個函數(shù),也適用同樣的規(guī)則: 首先,查看當(dāng)前函數(shù)的內(nèi)部,然后是這個函數(shù)被定義的環(huán)境,然后繼續(xù)向上,以此類推,一直到全局環(huán)境,然后,再查找其它已經(jīng)加載的包
? ?c)同樣的規(guī)則也適用于閉包——由其它函數(shù)創(chuàng)建的函數(shù)
a)
> x<-2
> g<-function(){
y<-1
c(x,y)
}
>
> g()
[1] 2 1
b)
> x<-1
> h<-function(){
y<-2
i<-function(){
z<-3
c(x,y,z)
}
i()
}
>
> h()
[1] 1 2 3
c)
> j<-function(x){
y<-2
function(){
c(x,y)
}
(2)函數(shù)和變量
對于函數(shù),規(guī)則有一點點調(diào)整。 如果很明顯你要的是函數(shù)(例如,f(3)),那么在這樣的語境中,R語言在搜索時,將忽略那些不是函數(shù)的對象。
> l<-function(x) x + 1
> m<-function(){
l<-function(x) x * 2
l(10)
}
> m()
[1] 20
(3)全新的開始狀態(tài)
?函數(shù)每次調(diào)用時,一個新的環(huán)境就會被創(chuàng)建出來,隨后函數(shù)會在該環(huán)境中執(zhí)行。函數(shù)無法報告它上一次被調(diào)用時發(fā)生了什么,因為每次調(diào)用都是完全獨立的。
> j<-function(){
if(!exists("a")){
a<-1
} else {
a<-a + 1
}
print(a)
}
>
> j()
[1] 1
> j()
[1] 1
(4)動態(tài)查找
詞法作用域決定了去哪里查找值,而不是決定在什么時候查找值。 R語言在函數(shù)運行時查找值,而不是在函數(shù)創(chuàng)建時查找值。這意味著,函數(shù)的輸出是可以隨著它所處的環(huán)境外面的對象,而發(fā)生變化的。








暫無數(shù)據(jù)