R 不循环地开始下一步

R 不循环地开始下一步,r,R,我有两个向量。一个是一系列开始或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) 开始虽然您没有明确说明问题,但我猜您想要的是: starts <- c(1,2,3,

我有两个向量。一个是一系列开始或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)

开始虽然您没有明确说明问题,但我猜您想要的是:

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
从18开始
# 18 + 1 -> 19
# 19 + 4 -> 23
更新:

抱歉,有一种方法可以不使用循环来完成;只需使用一个递归函数(如果可以通过循环获得相同的结果,我不建议使用该函数)


recursive.func虽然您没有明确说明问题,但我想您想要的是:

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
从18开始
# 18 + 1 -> 19
# 19 + 4 -> 23
更新:

抱歉,有一种方法可以不使用循环来完成;只需使用一个递归函数(如果可以通过循环获得相同的结果,我不建议使用该函数)



recursive.func请注意,您的示例不是有效的R代码:使用
c()
生成向量,并且不要将
next
用作变量名,因为这是一个保留字。我在回答中使用了正确的语法。为什么需要在不循环的情况下执行此操作?…或者您的意思是不使用
for
循环?@Dason,因为记录以百万计。请不要指定不希望在不循环的情况下执行此操作。告诉我们这些记录有数百万条,你需要一个快速的解决方案。如果最快的解决方案是使用循环,那么最快的解决方案是使用循环…请注意,您的示例不是有效的R代码:使用
c()
生成向量,并且不要使用
next
作为变量名,因为这是一个保留字。我在回答中使用了正确的语法。为什么需要在不循环的情况下执行此操作?…或者您的意思是不使用
for
循环?@Dason,因为记录以百万计。请不要指定不希望在不循环的情况下执行此操作。告诉我们这些记录有数百万条,你需要一个快速的解决方案。如果最快的解决方案是使用循环,那么最快的解决方案是使用循环…顺便说一句,将开始定义为
开始会给您一个不同的结果,即:
>开始+nexts[1]5 4 4 5 8 8 8 9 12 12 21 14 16 16 17 18 19 23 26
循环使用先前组合的结果。顺便说一句,我不认为没有循环就可以解决这个问题。即使您使用其他函数在代码中隐藏循环(我考虑的是
lappy
Reduce
),也很可能在较低级别的某个地方出现循环。不过,这并不会给出相同的结果(我猜上面的循环示例产生的结果是有意的)。顺便说一下,感谢您的回复,因为我的记录很大,你认为将循环限制器更改为while(i开始会给您带来不同的结果,即:
>开始+nexts[1]5 4 4 5 8 11 8 9 12 21 14 16 16 17 19 23 26
循环使用先前组合的结果。顺便说一句,我不认为没有循环就可以解决这个问题。即使您使用其他函数在代码中隐藏循环(我考虑的是
lappy
Reduce
),也很可能在较低级别的某个地方出现循环。不过,这并不会给出相同的结果(我猜上面的循环示例产生的结果是有意的)。顺便说一下,感谢您的回复,因为我的记录很大,你认为将循环限制器更改为while(i