R 不循环地开始下一步
我有两个向量。一个是一系列开始或id序列,另一个是从每个开始到下一个位置的指南 我分析的关键位置是第一个位置。我把对应的数字从下一个向量加到下一个要移动的位置上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,
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