2012-08-10 2 views
10
이 컬렉션의 인덱스 값을 통해 반복 할 때 다음 코드는 일반적으로 SO에 볼 수

:색인 반복 관용구

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

컬렉션이 비어있을 때 1:length(x)i을 제공 1:0되기 때문에 코드는 무례한 행동 값 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

seq 또는 seq_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

+1

그러나 인덱스 변수가 필요없고 무언가의 요소를 반복하려는 경우 lapply/sapply/vapply 또는 plyr 패키지의 요소 중 하나가 더 우아 할 수 있습니다. – Spacedman

+0

@Spacedman 매우 사실이며 확실히 OP가 염두에 두어야 할 사항입니다. – Dason