17.函数

本文深入探讨R语言中的函数基础、变量作用域、函数进阶及程序控制结构。通过实例解析函数定义与调用,讲解局部与全局变量的区别,以及如何进行函数式编程。适合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+100x 取的是 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这节不知道在说什么)

17.5 函数式编程介绍

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值