R编程
(学习资料参考北京大学李东风老师《R语言教程》)
16 程序控制结构
(看原网页吧 太难了 我没看懂= =)
17函数
17.1 函数基础
只举一个例子,输入一个函数:
fsub <- function(x, y=0){
cat("x=", x, " y=", y, "\n")
x - y
}
这个函数中指定了y的缺省值是0,也就是说默认y=0。
调用函数时
fsub(3, 1)
就可以得到x=3,y=1的值;
如果不输入y值,如下:
fsub(3)
那么得到的结果就是x=3,y=0的值(因为上面已经设置过缺省值)。
再如,sapply(X, FUN, …)中的形式参数FUN需要函数实参, 此函数有可能需要更多的参数。 例如,为了把1:5的每个元素都减去2,可以写成:
sapply(1:5, fsub, y=2)
或者
sapply(1:5, fsub, 2)
得到的结果都是一样的。
实际上,R语法中的大多数运算符如+, -, *, /, [, [[, (, {等都是函数。 这些特殊名字的函数要作为函数使用,需要使用反向单撇号`包围,比如:
1 + 2
和
`+`(1, 2)
得到的结果是一样的,反向单撇号是英文输入下的
因此,为了给1:5每个元素减去2,还可以写成sapply的形式如下:
sapply(1:5, `-`, 2)
或
sapply(1:5, "-", 2)
得到的结果如下
17.2 变量作用域
在所有函数外面(如R命令行)定义的变量是全局变量。
所谓局部变量, 就是仅在函数运行时才存在, 一旦退出函数就不存在的变量。
17.3 函数进阶
R语言允许在函数体内定义函数。 比如:
x <- -1
f0 <- function(x){
f1 <- function(){
x + 100
}
f1()
}
其中内嵌的函数 f1()
称为一个closure(闭包)。
内嵌的函数体内在读取某个变量值时, 如果此变量在函数体内还没有被赋值, 它就不是局部的, 会向定义的外面一层查找, 外层一层找不到,就继续向外查找。 上面例子 f1()
定义中的变量 x
不是局部变量, 就向外一层查找, 找到的会是 f0
的自变量 x
,而不是全局空间中 x
。 如:
f0(1)
最后 x+100
中x
取的是 f0
的实参值 x=1
, 而不是全局变量 x=-1
。
这样的变量查找规则叫做句法作用域(lexical scoping), 即函数运行时查找变量时, 从其定义时的环境向外层逐层查找, 而不是在运行时的环境中查找。
举例:
f0 <- function(){
f1 <- function(){
x <- -1
f2 <- function(){
x + 100
}
f2()
}
x <- 1000
f1()
}
f0()
其中f2()运行时, 用到的x是f1()函数体内的局部变量x=-1, 而不是被调用时f0()函数体内的局部变量x=1000, 所以结果是-1 + 100 = 99。
==ps.:==不懂f0是什么作用?如下图,去掉f0结果不也一样嘛?
17.4 程序调试
17.4.1 跟踪调试
17.4.2 出错调试选项
17.4.3 警告处理
17.4.4 stop()
、warning()
、message()
17.4.5 预防性设计
(哎呀17.4这节不知道在说什么)