《R语言编程艺术》——1.3 函数入门

1.3 函数入门

和大多数编程语言一样,R语言编程的核心是编写“函数”。函数就是一组指令的集合,用来读取输入、执行计算、返回结果。
我们先定义一个函数oddcount(),以此简单介绍函数的用法。这个函数的功能是计算整数向量中奇数的个数。一般情况下,我们会用文本编辑器编写好函数代码并保存在文件中,不过在这个简单粗略的例子中,我们只需要在R的交互模式中一行行输入代码。接下来,我们还会在几个测试案例中调用这个函数:

首先,我们告诉R想定义一个名为oddcount的函数,该函数有一个参数x。左花括号引出了函数体的开始部分。本例中,每行写一条R语句。
在函数体结束前,R会用+作为提示符,而不是用平常的>,以提醒用户现在还在定义函数。(实际上,+是续行符号,不是新输入的提示符。)在你键入右花括号来结束函数体之后,R又恢复使用>提示符。
定义完函数之后,本例调用了两次oddcount()函数。由于向量(1,3,5)中有3个奇数,所以调用oddcount(c(1,3,5))的返回值为3。(1,2,3,7,9)有4个奇数,所以第二次调用的返回值为4。
注意,在R中取余数的求模运算符是%%,见上面例子中的注释。例如,38除以7的余数为3。

首先,把x[1]赋值给n,然后测试n是奇数还是偶数。如果像本例中那样,n是奇数,则计数变量k增加。接着把x[2]赋值给n,测试其是奇数还是偶数,以此类推,重复后面的过程。
顺便说一句,C/C++程序员也许会把前面的循环写成这样:

在这里,length(x)是x的元素个数。假设x有25个元素。则1:length(x)就是1:25,意思是依次取1、2、3、……、25。上面的代码也能奏效(除非x的长度为0),但是R语言编程的戒律之一就是要尽可能避免使用循环,如果不能避免,就要让循环更简洁。重新看看这段代码原来的版本:

它更简单清晰,因为我们不需要使用length()函数和数组下标。
在代码的末尾,我们使用了return语句。

这条语句把k的计算结果返回给调用它的代码。不过,直接像下面这样写也可以达到目的:

在没有显式调用return()时,R语言的函数会返回最后计算的值。不过,这个方法必须慎重使用,7.4.1节会详细讨论这个问题。
在编程语言的术语里,x是函数oddcount()的形式参数(英文名称是formal argument或formal parameter,简称“形参”)。在前面例子第一次调用函数时,c(1,3,5)称为实际参数(actual argument,简称“实参”)。这两个术语暗示了这样的事实:函数定义中的x只是个占位符,而c(1,3,5)才是在计算中实际用到的参数。同样,在第二次调用函数时,c(1,2,3,7,9)是实际参数。
1.3.1 变量的作用域
只在函数体内部可见的变量对这个函数来说是“局部变量”。在oddcount()中,k和n都是局部变量。它们在函数返回值以后就撤销了:

需要注意的是,R函数中的形式参数是局部变量,这点非常重要。比如运行下面的命令:

现在,假如oddcount() 的代码改变了x的值,则z的值不会改变。调用oddcount()之后,z的取值还和之前一样。在计算函数调用的取值时,R会把每个实际参数复制给对应的局部参数变量,继而改变那些在函数外不可见的变量的取值。本书第7章将详细介绍“作用域法则”,上面提到的这些只是简单的例子。
全局变量是在函数之外创建的变量,在函数内部也可以访问。下面是个例子:

这里的y就是全局变量。
可以用R的“超赋值运算符”(superassignment operator)<<-在函数内部给全局变量赋值,将在第7章详细介绍。
1.3.2 默认参数
R语言也经常用到“默认参数”。考虑下面这样的函数定义:

如果程序员没有在函数调用时给y设定一个值,则y将初始化为2。同理,z也有默认值TRUE。
现在考虑下面的调用:

这里,数值12是x的实际参数,而且我们接受了y的默认值2,不过我们覆盖了z的默认值,将其设定为FALSE。
上面这个例子也表明:与其他编程语言一样,R语言也有“布尔类型”,包括TRUE和FALSE两个逻辑值。
注意 R语言允许TRUE和FALSE缩写为T和F。不过,如果你有名为T或F的变量,那么为了避免麻烦还是最好不要使用这样的缩写形式。

时间: 2024-10-31 12:50:32

《R语言编程艺术》——1.3 函数入门的相关文章

《R语言编程艺术》——3.4 增加或删除矩阵的行或列

3.4 增加或删除矩阵的行或列 严格来说,矩阵的长度和维度是固定的,因此不能增加或删除行或列.但是可以给矩阵重新赋值,这样可以得到和增加或删除一样的效果.3.4.1 改变矩阵的大小 回忆之前通过重新赋值改变向量大小的方法: 第一个例子里,x原来长度为5,通过拼接和重新赋值,将其长度变为6.事实上我们没有改变x的长度,而是生成一个新的向量,然后赋值给x. 注意 重新赋值的过程可能会在用户看不见的情况下进行,在14章我们将会介绍.例如,即使是x[2]<-12这种小操作事实上都是一个重新赋值的过程.

《R语言编程艺术》——导读

前言 R是一种用于数据处理和统计分析的脚本语言,它受到由AT&T实验室开发的统计语言S的启发,且基本上兼容于S语言.S语言的名称代表统计学(statistics),用来纪念AT&T开发的另一门以一个字母命名的编程语言,这就是著名的C语言.后来一家小公司买下了S,给它添加了图形用户界面并命名为S-Plus. 由于R是免费的,而且有更多的人贡献自己的代码,R语言变得比S和S-Plus更受欢迎.R有时亦称为GNU S,以反映它的开源属性.(GNU项目是开源软件的一个重要集合.) 为什么在统计工作

《R语言编程艺术》——第2章 2.0 向量

第2章 2.0 向量 R语言最基本的数据类型是向量(vector).第1章已经给出了向量的一些例子,本章将详细介绍向量.首先考察向量与R语言的其他数据类型之间的关系.与C语言家族不同,R语言中,单个数值(标量)没有单独的数据类型,它只不过是向量的一种特例.而另一方面,R语言中矩阵是向量的一种特例,这一点与C语言家族相同.接下来我们会用大量时间关注以下话题:循环补齐:在一定情况下自动延长向量.筛选:提取向量子集.向量化:对向量的每一个元素应用函数.这些运算是R编程的核心,在本书的其他部分也会经常提

《R语言编程艺术》——2.1 标量、向量、数组与矩阵

2.1 标量.向量.数组与矩阵 在许多编程语言中,向量与标量(即单个数值)不同.例如,考虑下面的C代码: 这段代码请求编译器给一个x的整型变量x分配空间,并给一个名为y的三元素整型数组(C语言中的术语,类似于R中的向量)分配内存空间.但在R中,数字实际上被当做一元向量,因为数据类型里没有标量.R语言中变量类型称为模式(mode).回顾第1章,同一向量中的所有元素必须是相同的模式,可以是整型.数值型(浮点数).字符型(字符串).逻辑型(布尔逻辑).复数型等等.如果在程序中查看变量x的类型,可以调用

《R语言编程艺术》——1.4 R语言中一些重要的数据结构

1.4 R语言中一些重要的数据结构 R有多种数据结构.本节将简单介绍几种常用的数据结构,使读者在深入细节之前先对R语言有个大概的认识.这样,读者至少可以开始尝试一些很有意义的例子,即使这些例子背后更多的细节还需要过一段时间才能揭晓.1.4.1 向量,R语言中的战斗机 向量类型是R语言的核心.很难想象R语言代码或者R交互式会话可以一点都不涉及向量. 向量的元素必须属于某种"模式"(mode),或者说是数据类型.一个向量可以由三个字符串组成(字符模式),或者由三个整数元素组成(整数模式),

《R语言编程艺术》——1.7 获取帮助

1.7 获取帮助 有很多种资源可以帮你学习关于R的更多知识,其中包括R自身的一些工具,当然,还有网上的资料. 开发者们做了很多工作使R更加自文档化.下面我们将介绍一些R内置的帮助工具,以及互联网上的资源.1.7.1 help()函数 想获取在线帮助,可调用help().例如,要获取seq()函数的信息,就键入下面的命令: 1.7.2 example()函数 每个帮助条目都附带有例子.R的一个非常好用的特性是,example()函数会为你运行例子代码.示例如下: sep()函数可以生成多种等差数值

《R语言编程艺术》——1.5 扩展案例:考试成绩的回归分析

1.5 扩展案例:考试成绩的回归分析 在接下来的案例中,我们会从头到尾进行一个简单的统计回归分析.这个例子实际上没有多少编程技术,不过它说明了如何使用前面提到的一些数据结构,包括R的S3对象.同样,它在后面的章节里也充当了编程案例的基础. ExamsQuiz.txt文件包含了我所教班级的成绩.下面是该文件的前几行: 数字表示的是学生成绩的学分绩点.比如绩点3.3对应的就是平常所说的B+.每一行包含的是一个学生的数据,由期中考试成绩.期末考试成绩和平均小测验成绩组成.此例的兴趣点在于用期中考试成绩

《R语言编程艺术》——2.12 关于c()的更多内容

2.12 关于c()的更多内容 在本节中,我们将讨论与连接函数c()相关的一些其他内容,有时经常用到.如果传递到c()中的参数有不同的类型,则它们将被降级为同一类型,该类型最大限度地保留它们的共同特性,如下所示: 在第一个例子中,我们混合了整数型和字符型,R会选择把它们都转换为后者的类型.在第二个例子中,对于混合的表达式,R认为列表类型有较低的优先级.本书4.3节将对这一点作深入探讨.你可能不会写如此组合的代码,但你可能会遇到发生这种情况的代码,因此理解它的效果显得尤为重要.另一个需要注意的关键

《R语言编程艺术》——1.2 第一个R会话

1.2 第一个R会话 用数字1.2.4生成一个简单的数据集(用R的说法就是"向量"),将其命名为x: R语言的标准赋值运算符是<-.也可以用=,不过并不建议用它,因为在有些特殊的情况下它会失灵.注意,变量的类型并不是固定不变的.在这里,我们把一个向量赋值给x,也许之后会把其他类型的值赋给它.我们会在1.4节介绍向量和其他类型.c表示"连接"(英文是concatenate).在这里,我们把数字1.2.4连接起来.更精确地说,连接的是分别包含三个数字的三个一元向量