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
2
1
关注作者
收藏
评论(0)
发表评论
暂无数据
推荐帖子
0条评论
0条评论
1条评论