2012-08-10 25 views
10

下面的代碼是在SO常見,當談到遍歷集合的索引值:指數迭代成語

for (i in 1:length(x)) { 
    # ... 
} 

代碼行爲不端,當集合爲空,因爲1:length(x)成爲1:0這給i的值爲10

iterate <- function(x) { 
    for (i in 1:length(x)) { 
     cat('x[[', i, ']] is', x[[i]], '\n') 
    } 
} 

> iterate(c(1,2,3)) 
x[[ 1 ]] is 1 
x[[ 2 ]] is 2 
x[[ 3 ]] is 3 

> iterate(c()) 
x[[ 1 ]] is 
x[[ 0 ]] is 

我記得看到一個優雅的成語來定義一個沒有元素時x是空的,但我不記得它的序列。你用什麼成語?

回答

12

seqseq_along當您的興趣對象爲空時,會給您更合理的東西。

> x <- NULL 
> seq(x) 
integer(0) 
> seq_along(x) 
integer(0) 
> x <- rnorm(5) 
> seq(x) 
[1] 1 2 3 4 5 
> seq_along(x) 
[1] 1 2 3 4 5 
+0

完美,'seq_along'是我看到的成語。 – Sim 2012-08-10 03:43:41

+1

但是,如果你不需要索引變量,只想循環某些東西的元素,lapply/sapply/vapply或plyr包中的某個東西可能會更優雅。 – Spacedman 2012-08-10 06:42:11

+0

@Spacedman非常真實,這絕對是OP應該記住的東西。 – Dason 2012-08-10 13:44:03