0

私は2つのベクトルを持っています。1 つは一連のスタートまたは一連の ID で、もう 1 つは各スタートから次の場所へのガイドです。

私の分析の重要な位置は最初の位置です。次のベクトルの対応する番号を、次に移動する位置に追加します。

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 で、私は 9 に移動し、9 から次の移動は 3 です...

最終的なゴールは、この 1 つのゴール <- c(5,8,9,12....) のようなベクトルになります。各「着地」で次の移動のサイズを読み取るだけで nexts を使用して「ジャンプ」を行うことができる場合、最初のベクトル「開始」は実際には必要ないかもしれません。このように: 1 から 4 にジャンプし、5 に到達するには、位置 5 から位置 8 に 3 をジャンプし、位置 8 から 9 に位置 1 をジャンプします....

4

1 に答える 1

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

アップデート:

申し訳ありませんが、ループなしでそれを行う方法があります。再帰関数を使用するだけです(ループで同じ結果が得られる場合はお勧めしません)...

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)
于 2013-03-19T16:28:30.483 に答える