热线电话:13121318867

登录
2018-10-17 阅读量: 1147
使用R自定义函数的学习分享整理

函数的组成部分

1  函数体:body(),函数的代码

2  形式参数列表:formals(),控制函数调用的参数列表

3  环境:environment(),函数的变量所在位置的“地图”

> f<-function(x) x^2

> f

function(x) x^2

> formals(f)

$x

> body(f)

x^2

> environment(f)

<environment: R_GlobalEnv>

函数都有上述三个组成部分,有一个例外:原语函数(如:sum等),它是直接用.Primitive()调用C语言代码,并且不包含R语言代码。因此它们的formals()、body()、environment()都是NULL

四个基本原则:

名字屏蔽、函数和变量、全新的开始状态、动态查找

(1)名字屏蔽

a)如果一个名字在函数中没有定义,那么R语言将向上一个层次查找。

   b)如果一个函数内部定义了另一个函数,也适用同样的规则: 首先,查看当前函数的内部,然后是这个函数被定义的环境,然后继续向上,以此类推,一直到全局环境,然后,再查找其它已经加载的包

   c)同样的规则也适用于闭包——由其它函数创建的函数

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)函数和变量

对于函数,规则有一点点调整。 如果很明显你要的是函数(例如,f(3)),那么在这样的语境中,R语言在搜索时,将忽略那些不是函数的对象。

> l<-function(x) x + 1

> m<-function(){

l<-function(x) x * 2

l(10)

}

> m()

[1] 20

(3)全新的开始状态

 函数每次调用时,一个新的环境就会被创建出来,随后函数会在该环境中执行。函数无法报告它上一次被调用时发生了什么,因为每次调用都是完全独立的。


> j<-function(){

if(!exists("a")){

a<-1

} else {

a<-a + 1

}

print(a)

}

>

> j()

[1] 1

> j()

[1] 1

(4)动态查找

词法作用域决定了去哪里查找值,而不是决定在什么时候查找值。 R语言在函数运行时查找值,而不是在函数创建时查找值。这意味着,函数的输出是可以随着它所处的环境外面的对象,而发生变化的。

79.8666
1
关注作者
收藏
评论(0)

发表评论

暂无数据
推荐帖子