循环习语危险吗?

时间:2011-09-01 19:03:20

标签: r

An Introduction to R

为例
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]]))
}

似乎for(i in 1:length(yc)) { ...是在需要处理当前索引的情况下迭代列表或向量的习惯用法。然而,这在空列表的情况下会中断,因为1:0不是空向量。当你不能保证非空列表时,我应该用什么成语来迭代列表/向量索引?我在想if(length(yc)) for(i in 1:length(yc)) { ...但是有更好的方法吗?

4 个答案:

答案 0 :(得分:11)

您正在寻找seq_along

> seq_along(as.list(1:2))
[1] 1 2
> seq_along(list())
integer(0)

答案 1 :(得分:7)

您可以使用seq_along

for(i in seq_along(yc)) {...}

我很确定这会绕过问题并且应该更快一点。

答案 2 :(得分:4)

“The R Inferno”第75页介绍了这个问题:http://www.burns-stat.com/pages/Tutor/R_inferno.pdf

它还告诉你一些其他方法可以解决你的循环错误。

答案 3 :(得分:0)

对于偶然发现这一点的人 - 如果你想要一个基于可能为零长度的索引向量而不是另一个向量,你可以安全地使用seq(1, length.out = L),其中L可以是任何非负整数。如果integer(0),则会L == 0,否则会1:L

当然,如果L == length(something),这里给出的其他解决方案更简洁,但我遇到的问题并非如此,所以我认为我会为后代写下来。

同样seq(1, length.out = L)可以缩写为seq_len(L),根据?seq更快。