2013-03-19 110 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) 

我希望有開始在「開始」 1,旁邊告訴我移動4個地方,所以我最終開始於1 + 4,然後開始5旁邊告訴我繼續前進3位,現在我在開始圖8中,在第8位置對應的下一個是1,I移動到如圖9所示,從9的下一步的行動是3 ...

最終目標會是這樣一個目標<載體 - C( 5,8,9,12 ....)。如果我們可以通過在每次「着陸」時讀取下一步移動的大小來實現「跳躍」,則可能不需要第一個「開始」向量。像這樣:從1我們跳到4,到達5,從位置5我們跳轉到8,從8我們跳到1到9 ....

+0

請注意,您的例子是無效的R代碼裏面:讓使用'C向量()' ,並且不要使用'next'作爲變量名稱,因爲這是一個保留字。我在答案中使用了正確的語法。 – 2013-03-19 16:23:54

+0

爲什麼需要做這個沒有循環? – Dason 2013-03-19 16:24:11

+0

...或者你的意思是不使用'for'循環? – 2013-03-19 16:26:25

回答

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

順便說一句,如果它是連續的,那麼將起始定義爲'starts < - 1:20'比較容易。 – Stingery 2013-03-19 16:30:07

+1

這會給你一個不同的結果,即:'> starts + nexts [1] 5 4 4 5 8 11 8 9 12 12 21 14 16 18 16 17 18 19 23 26'循環使用前面的組合結果。順便說一句,我不認爲這可以解決沒有循環。即使你使用一些其他函數來隱藏代碼中的循環(我正在考慮'lapply'或'Reduce'),最有可能的是在較低級別上的某處循環。 – Stingery 2013-03-19 16:46:11

+0

不過,這並沒有給出相同的結果(我猜想上面的循環示例產生的結果是有意的)。 – Stingery 2013-03-19 17:07:10

相關問題