
2.4 R的基础编程知识
R语言与C语言等其他编程语言相似,自身有一套编程体系。尽管这个体系非常庞杂,但是对于入门者而言,只需要掌握其中一些核心的内容就可以完成大部分简单的数据操作和计算。本节将会针对R语言编程的部分核心内容进行简要介绍,从而让初学者快速掌握一些基本概念。
2.4.1 赋值
赋值就是把计算好的结果赋予一个变量的过程,在前面的介绍中已经用到了赋值操作。在R中,可以使用等号(=)或箭头(<-和->)来对变量进行赋值。

尽管在R中可以灵活地使用以上3种方法进行赋值,但是有时候作为项目管理,应该统一编程风格。例如有的规范中建议在所有函数定义的时候用“=”,而在数值保存的时候使用“<-”。而日常使用中,因为编写代码总是有从左到右的习惯,则可以灵活地使用“->”来进行赋值。在R中,还可以使用assign函数来为一个变量名进行赋值,如下所示。

这里,“a”是一个字符,它代表了变量的名称。
2.4.2 函数
函数式编程是R的一大特色,在R中无时无刻不在调用函数来实现不同的算法。例如,如果想要求得一个数值型向量的均值,可以使用R内置的mean函数实现。

sum函数则可以求得数值型向量的总和。

在日常工作中,常常需要自定义函数来完成特定的任务,例如想利用勾股定理来求直角三角形斜边的长度。下面,通过构造一个名为“get_length”的函数来完成这个计算任务。

2.4.3 强制类型转换
R中的基本数据类型在一定条件下可以进行相互转化。举一个例子,在R中认为,逻辑型的函数,TRUE的值是1,FALSE的值是0,通过as.numeric函数强制类型转换,能够看到这个关系。

这里,把逻辑型数据转化为了数值型数据。这个操作是可逆的,可以使用as.logical函数把数值1和0重新转化为逻辑型数据。

逻辑型和数值型的数据都可以使用as.character函数转化为字符型数据。

说明:在R中,可以使用以“as.”为前缀的函数对数据进行强制类型转换。
2.4.4 条件判断
在R中经常要使用条件判断来实现分支结构,如果满足某一条件就执行A操作,否则执行B操作,if语句和else语句可以轻松地实现这个过程。

还可以用ifelse语句直接实现这个结构。

2.4.5 循环操作
在批处理过程中,往往需要利用循环来对数据进行遍历,以计算所有的情况。在R中使用循环非常灵活,例如要打印1到10的所有正整数,可以利用for循环来编写代码加以实现。


还可以使用while语句,通过条件判断来实现上面的操作。

需要注意的是,在上面的操作中,给i定义了初始值1,并在每一步运算结束后加上了1来推进遍历操作。
最后,还要介绍repeat语句,它相当于“while(1)”,也就是没有遇到终止操作break,它就会一直运行下去。以下代码利用repeat语句实现了以上操作。

