大数据分析与应用实战:统计机器学习之数据导向编程
上QQ阅读APP看书,第一时间看更新

1.7.1 控制流程

大多数的程序代码是以循序的方式从头执行到尾,但有时我们会反复地执行某些指令语句许多次;或者当某些条件判断式满足(R返回TRUE,Python返回True)或不满足(R返回FALSE,Python返回False)时,反复地执行一段语句;也可以在条件满足或不满足时,一次性地执行一段语句。这些程序编写方式就统称为控制语句或控制流程(control statements or flow),以R语言而言,前述的头两种情况可以用for、while和repeat等循环控制语句,最后一种则是if或if…else…条件判断语句,以及ifelse()函数。

· R语言控制语句for循环,其语法(syntax)为:

for (name in vector) {commands}

下面是输出数值向量中各个元素平方值的显式循环(explicit looping或称外显循环)写法:

首先创建向量对象x,n为循环指标变量(index variable)。因为向量对象长度为3,所以大括号中的输出指令会执行三次,依续输出向量中三个元素的平方值。

· 接着是未事先固定执行次数while循环,其语法为:

while (condition) {statements}

下例中先将循环指标变量的初始值设为1,只要指标变量的值不超过10(i<=10),就反复将其值往上加4。因此整个while循环会执行三次,最后离开循环时的i值为13。

另一个例子是牛顿法求根(解fx)=0),如果函数值与零的距离不低于允许误差(tolerance)0.000001,则继续执行while循环大括号中解的更新过程。

· 第三种循环语句是repeat,其语法为:

repeat{statements}

继续以牛顿法求根为例,请注意大括号中含有if(condition)break的语句,一旦函数值与零的距离低于tolerance,就执行break指令跳出repeat循环。

· 最后是条件判断语句if与if…else…,其语法为:

if (condition){commands when TRUE}

if (condition) {commands when TRUE}else{commands when FALSE}

下例中grade是内容为成绩等级的字符串向量,首先用is.character()函数判定grade是否为字符串向量,如为TRUE则执行后方大括号内语句一次,将grade强制转换为factor向量并更新它;再用is.factor()函数判定grade是否不为因子向量,结果如为TRUE,则执行if关键词后方大括号内语句一次,也是将grade强制转换为factor向量,并更新它;结果如为FALSE,则执行else关键词后方大括号内语句一次,输出条件判定的结果说明:"Grade already is a factor."。

读者请注意各控制语句语法的关键词,小括号内的条件(condition),以及大括号内指令语句的主体{commands}。相较于来自计算机科学界的Python语言,R语言源于数学与统计特定领域(domain specific),所以程序语言结构较为宽松,许多有经验的程序员经常将成对大括号省略,造成新手对程序代码的理解存在困难。以自定义函数为例,下面两种定义是一样的:

f<-function(x,y)x+y

f<-function(x,y) {x+y}

此外,数据处理与分析常须取出符合某些条件的数据子集,建议读者尽量采用逻辑值索引(1.3.7节R语言原生数据对象取值),避免运用条件式语法。