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

简介: 本节书摘来自华章计算机《R语言编程艺术》一书中的第1章,第1.3节,作者:(美)麦特洛夫(Matloff,N.)著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

1.3 函数入门

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

image

首先,我们告诉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。

image

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

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

image

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

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

image

在没有显式调用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都是局部变量。它们在函数返回值以后就撤销了:
image

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

image

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

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

image

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

image

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

相关文章
|
5月前
|
数据挖掘 C语言 C++
R语言是一种强大的统计分析工具,提供了丰富的函数和包用于时间序列分析。
【10月更文挑战第21天】时间序列分析是一种重要的数据分析方法,广泛应用于经济学、金融学、气象学、生态学等领域。R语言是一种强大的统计分析工具,提供了丰富的函数和包用于时间序列分析。本文将介绍使用R语言进行时间序列分析的基本概念、方法和实例,帮助读者掌握R语言在时间序列分析中的应用。
102 3
|
7月前
|
并行计算 IDE 数据挖掘
R语言入门:如何安装与配置环境
【8月更文挑战第27天】通过本文的指南,你应该能够顺利安装并配置R语言环境,以便进行数据分析和编程任务。R语言以其强大的功能和灵活的扩展性,成为数据分析领域的重要工具。希望本文能够帮助你入门R语言,并激发你进一步学习和探索的兴趣。随着经验的积累,你将能够充分利用R语言的优势,提高工作效率和数据处理能力。
|
7月前
|
数据可视化 数据挖掘 数据处理
R语言函数与自定义函数:提高代码的复用性
【8月更文挑战第27天】 自定义函数是R语言编程中不可或缺的一部分,它们通过封装复杂的逻辑和提供灵活的参数化设计,极大地提高了代码的复用性和可维护性。通过掌握自定义函数的基本语法和高级技巧,我们可以编写出更加高效、可读的R语言代码,从而更好地应对复杂的数据分析和统计建模任务。
|
7月前
|
数据采集 机器学习/深度学习 数据可视化
使用R语言进行统计分析:入门与实践
【8月更文挑战第10天】通过本文,我们介绍了使用R语言进行统计分析的基本流程,包括数据加载、数据清洗、描述性统计、假设检验以及数据可视化等关键步骤。R语言以其强大的功能和丰富的包资源,为数据分析师和科学家提供了强大的工具。随着你对R语言的
|
10月前
|
存储 数据处理 数据库
R语言入门:基础语法和数据结构
【4月更文挑战第25天】本文为R语言初学者提供入门指南,介绍R语言起源、安装配置、基本语法、数据类型和结构、数据操作以及统计和图形绘制。R语言是强大的统计分析工具,拥有丰富数据处理功能和活跃社区。通过学习变量赋值、控制结构、向量、矩阵、数组、数据框和列表,以及数据导入导出、筛选修改,可奠定R语言基础。掌握基础后,可进一步探索其在统计计算和图形绘制中的应用。
140 2
|
10月前
|
图形学
R语言其他相关函数(各函数解析含实例,可供查询)
R语言其他相关函数(各函数解析含实例,可供查询)
244 0
|
10月前
R语言绘图相关函数(含实例)
R语言绘图相关函数(含实例)
107 0
|
10月前
|
数据可视化
R语言用非凸惩罚函数回归(SCAD、MCP)分析前列腺数据
R语言用非凸惩罚函数回归(SCAD、MCP)分析前列腺数据
|
10月前
|
数据可视化
R语言可视化渐近正态性、收敛性:大数定律、中心极限定理、经验累积分布函数
R语言可视化渐近正态性、收敛性:大数定律、中心极限定理、经验累积分布函数
|
10月前
|
算法 Windows
R语言广义二次跳跃、非线性跳跃扩散过程转移函数密度的估计及其应用
R语言广义二次跳跃、非线性跳跃扩散过程转移函数密度的估计及其应用