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








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