17.函数

本文深入探讨R语言中的函数基础、变量作用域、函数进阶及程序控制结构。通过实例解析函数定义与调用,讲解局部与全局变量的区别,以及如何进行函数式编程。适合R语言初学者和进阶者阅读。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


(学习资料参考北京大学李东风老师《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 函数式编程介绍

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值