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)) { ...
但是有更好的方法吗?
答案 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
更快。