2011-09-01 1 views
6

위험한 for 루프 관용구? 예를 복용

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

An Introduction to R에서 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)) {...} 

나는이 문제 를 무시하고이 작은 조금 더 빠르게 처리 될 확신합니다. http://www.burns-stat.com/pages/Tutor/R_inferno.pdf

그것은 당신에게 잘못뿐만 아니라 루프를 얻을 수있는 몇 가지 다른 방법을 알려줍니다

+0

감사합니다 Nick (거의 동시에 2 개의 좋은 해답을 얻었습니다) – Keith

4

이 질문에 '는 R 지옥'의 75 페이지에 덮여있다.

+0

Welcome to StackOverflow! R inferno가 여기에서 높이 평가 받고 있음을 알게 될 것입니다. 감사합니다. – Aaron

0

이 문제가 발생하는 경우 - 다른 벡터가 아닌 길이가 0 인 인덱스 벡터를 원할 경우 seq(1, length.out = L)을 사용할 수 있습니다. 여기서 L은 음이 아닌 정수가 될 수 있습니다. 그렇지 않으면 L == 0 일 경우 integer(0), 그렇지 않은 경우 1:L이 표시됩니다.

물론 다른 솔루션은 L == length(something) 인 경우 더 간결하지만 여기서는 그렇지 않은 문제가있어서 자손을 위해 적어 둘 것이라고 생각했습니다.

seq(1, length.out = L)seq_len(L)으로 축약 될 수 있으며, 이는 ?seq에 따라 더 빠릅니다.