2011-09-01 70 views
6

采取一个例子从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)) { ...,但有没有更好的方法?

回答

11

您正在查找seq_along

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

究竟是我在找什么 – Keith

+2

......并且当你已经有长度的时候使用'seq_len' ... – Tommy

7

您可以使用seq_along

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

我敢肯定,这也避开这个问题应该是一点点更快。

+0

感谢Nick(几乎同时有两个很好的答案) – Keith

4

这个问题是涉及“将R地狱”的75页:http://www.burns-stat.com/pages/Tutor/R_inferno.pdf

它会告诉你一些其他的方式来获得你的循环错误也是如此。

+0

欢迎来到StackOverflow!你会发现R地狱在这里被高度重视。这是一个很好的资源,谢谢! – Aaron

0

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

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

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