我有两个向量。一个是一系列开始或一系列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,我移动到9,从9开始,下一步是3 ...
最终目标是像这一目标一样的矢量&lt; -c(5,8,9,12 ......)。如果我们可以通过只读取每次“着陆”下一次移动的大小来使用nexts进行“跳跃”,则可能不需要第一个向量“开始”。像这样:从1我们跳4,到5,从5位我们从8跳到3位8我们跳1位到9 ....
答案 0 :(得分: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)