2013-03-19 2 views
0

두 벡터가 있습니다. 하나는 일련의 시작 또는 일련의 id이고 다른 하나는 각 시작에서 다음 위치에 대한 안내입니다.루핑없이 다음으로 시작

분석을위한 주요 위치가 첫 번째 위치입니다. 다음 벡터에서 해당 숫자를 위치에 추가하여 다음으로 이동해야합니다. 나는에서 시작되어있을 것으로 예상 무엇

starts <- c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20) 
nexts <- c(4,2,1,1,3,5,1,1,3,2,10,2,3,4,1,1,1,1,4,6) 

는 다음 4 개 장소를 이동하는 나에게 말한다, 1 "시작", 그래서 1 + 4, 다음 시작 5에서 다음 3 개 장소를 이동하는 나에게 말한다 시작에 나는 결국 이제 시작 8시에 8시에 해당하는 다음 숫자는 1이고, 9에서 9로 이동하면 다음 이동은 3 ...

최종 목표는이 목표와 같은 벡터 일 것입니다 < - c (5,8,9,12 ....). 각 "착륙"에서 다음 이동의 크기를 읽는 것만으로 다음을 사용하여 "점프"를 할 수 있다면 첫 번째 벡터 "시작"이 실제로 필요하지 않을 수도 있습니다. 1에서 4로 뛰어 오르고 5에 도착하고 5에서 3으로 8에서 1로 이동하여 8에서 1로 이동합니다.

+0

예제는 유효하지 않습니다. R 코드 :'c()'를 사용하여 벡터를 만드십시오. , 예약어이기 때문에'next'를 변수 이름으로 사용하지 마십시오. 내 대답에 올바른 구문을 사용했습니다. –

+0

왜 루핑하지 않고 이것을해야합니까? – Dason

+0

... 아니면'for' 루프를 사용하지 않는다는 것을 의미합니까? –

답변

3

질문을 명확하게 말하지는 않았지만 당신이 원하는 것은 이것이다 :

starts <- c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20) 
nexts <- c(4,2,1,1,3,5,1,1,3,2,10,2,3,4,1,1,1,1,4,6) 

i <- 1 
while (i %in% starts) { 
    s <- starts[i] 
    n <- nexts[s] ### <--- correction: not nexts[i] 
    i <- s + n 
    cat(sprintf("%d + %d -> %d\n", s, n, i)) 
} 

# 1 + 4 -> 5 
# 5 + 3 -> 8 
# 8 + 1 -> 9 
# 9 + 3 -> 12 
# 12 + 2 -> 14 
# 14 + 4 -> 18 
# 18 + 1 -> 19 
# 19 + 4 -> 23 

UPDATE :

죄송합니다, 루프없이 할 수있는 방법이있다; (루프로 같은 결과를 얻을 수 있다면 재귀 함수를 사용하십시오.) ...

recursive.func <- function(start, starts, nexts) { 
    next.start <- start + nexts[start] 
    if (!next.start %in% starts) 
     return(next.start) 
    return(c(next.start, recursive.func(next.start, starts, nexts))) 
} 

# execute like this: 
my.start <- starts[1] 
recursive.func(my.start, starts, nexts) 
+0

BTW, 그것은 연속적이라면'starts <- 1 : 20'으로 시작을 정의하는 것이 더 쉽습니다. – Stingery

+1

이렇게하면 다음과 같은 결과를 얻을 수 있습니다 :'> starts + nexts [1] 5 4 4 5 8 11 8 9 12 12 21 14 16 18 16 17 18 19 23 26' 루프는 이전 조합의 결과를 사용합니다 . BTW, 나는 이것을 반복하지 않고 해결할 수 있다고 생각하지 않습니다. 다른 함수를 사용하여 코드에서 루프를 숨길지라도 (저도'lapply' 또는'Reduce'를 생각하고 있습니다) 가장 낮은 레벨의 어딘가에서 반복 될 가능성이 큽니다. – Stingery

+0

그래도이 결과는 같지 않습니다 (위의 루프 예제에서 얻은 결과가 의도 된 것 같습니다). – Stingery