9.2.2 循环控制:for循环,repeat 和while
R 语言有下面形式的for 循环架构
> for (name in expr 1) expr 2
其中 name
是循环变量,expr_1 是一个向量表达式(常常以 1:20
这种形式出现), 而 expr_2 常常是根据虚拟变量 name
而设计的成组表达式。在name
访问 expr_1 所有可以取到的值时,expr_2
都会运行。
下面是个例子。假定 ind
是分类指标向量(vector of class indicators),我们将依这种分类指标绘制 y
对 x
的散点图。一种方法时用函数 coplot()
1 产生对应因子各个水平的散点图。另外一种方法就是把所有图在屏幕上同时显示,如下面命令所示:
> xc <- split(x, ind)
> yc <- split(y, ind)
> for (i in 1:length(yc)) {
plot(xc[[i]], yc[[i]])
abline(lsfit(xc[[i]], yc[[i]]))
}
(注意函数 split()
通过某个因子把一个大的向量分成一系列小的向量。这是一个非常有用的函数,常常和盒状图一起使用。具体细节可以用 help
命令得到。)
警告:相比其他程序语言,R 代码里面很少使用 for()
形式的循环语句。在 R 里面用‘完整对象’(whole object)形式可能既清晰又高效2。
其他循环语句包括
> repeat expr
和语句
> while (condition) expr
关键字 break
可以用于结束任何循环,甚至是非常规的。它是结束 repeat
循环的唯一办法。
关键字 next
可以用来结束一次特定的循环,然后直接跳入“下一次”循环。
控制语句的应用常常和函数相关。这在下一章编写你自己的函数中会详细讨论,同时也会引用更多的例子。
1. 将在后面的的内容中讨论,或者用包 lattice 里面的函数 xyplot。 ↩
2. 译者注:R 里面显式的循环语句在时间和空间的运行效率上几乎是不能忍受的。但显式的循环常常能避免的,我们可以利用函数对象对成组的元素计算值, 如用 sum,mean 等统计函数及 apply、lapply 、sapply、tapply 等函数都可以部分代替显式循环。 ↩