R 当循环中的一个值大于另一个值时,停止循环函数

R 当循环中的一个值大于另一个值时,停止循环函数,r,loops,while-loop,R,Loops,While Loop,我一直在尝试编写while命令,以便在循环生成的一个值超过另一个值时停止循环函数。但是,我没有找到正确的方法 for循环运行30天,但我希望它在寄生虫l.A的最后一个值小于寄生虫l.B时立即停止 我已经包括了生成数据和for循环的工作代码 不限制循环的替代解决方案也将受到极大的赞赏 # Subject A, initially 400 parasites, growing by 10 % subA = 400 infA = 1.1 # Subject B, initially 120 para

我一直在尝试编写
while
命令,以便在循环生成的一个值超过另一个值时停止循环函数。但是,我没有找到正确的方法

for
循环运行30天,但我希望它在
寄生虫l.A
的最后一个值小于
寄生虫l.B
时立即停止

我已经包括了生成数据和for循环的工作代码

不限制循环的替代解决方案也将受到极大的赞赏

# Subject A, initially 400 parasites, growing by 10 %
subA = 400
infA = 1.1

# Subject B, initially 120 parasites, growing by 20 %
subB = 120
infB = 1.2

# How many days to model
days = 30

days_seq = seq(1, days, 1)

# Parasite load for A
parasite_l.A = rep(NA, days)
parasite_l.A[1] = subA

# Parasite load for B
parasite_l.B = rep(NA, days)
parasite_l.B[1] = subB

# Loop for subject A and B
for(i in 1:(days)){
    parasite_l.A[i+1] = parasite_l.A[i]*(infA)
    parasite_l.B[i+1] = parasite_l.B[i]*(infB)
  }

parasite_l.A
parasite_l.B

在循环内部使用类似于:

    if (parasite_l.A > parasite_l.B) {
      break
}
如果(寄生虫A<寄生虫B){//如果寄生虫A小于B,请执行以下操作//
(我在1:(天内){
寄生虫A[i+1]=寄生虫A[i]*(infA)
寄生虫_l.B[i+1]=寄生虫_l.B[i]*(infB)
}
}

有一个内置的控制流函数,用于您所指的
while
。只要满足条件,它将继续循环

i <- 1    
while (parasite_l.A[i] > parasite_l.B[i]) {
      parasite_l.A[i+1] = parasite_l.A[i]*(infA)
    parasite_l.B[i+1] = parasite_l.B[i]*(infB)
    i <- i + 1
}

# parasite_l.A
#  [1]  400.0000  440.0000  484.0000  532.4000  585.6400  644.2040  708.6244
#  [8]  779.4868  857.4355  943.1791 1037.4970 1141.2467 1255.3714 1380.9085
# [15] 1518.9993        NA        NA        NA        NA        NA        NA
# [22]        NA        NA        NA        NA        NA        NA        NA
# [29]        NA        NA
#  parasite_l.B
#  [1]  120.0000  144.0000  172.8000  207.3600  248.8320  298.5984  358.3181
#  [8]  429.9817  515.9780  619.1736  743.0084  891.6100 1069.9321 1283.9185
# [15] 1540.7022        NA        NA        NA        NA        NA        NA
# [22]        NA        NA        NA        NA        NA        NA        NA
# [29]        NA        NA
i寄生虫_l.B[i]){
寄生虫A[i+1]=寄生虫A[i]*(infA)
寄生虫_l.B[i+1]=寄生虫_l.B[i]*(infB)
i使用一个索引值(
i
),一对计数器(
a.index.value
B.index.value
),以及一个
while
循环:

# Subject A, initially 400 parasites, growing by 10 %
subA <- A.index.value <- 400
infA <- 1.1

# Subject B, initially 120 parasites, growing by 20 %
subB <- B.index.value <- 120
infB <- 1.2

# How many days to model
days <- 30

days_seq <- seq(1, days, 1)

# Parasite load for A
parasite_l.A <- rep(NA, days)
parasite_l.A[1] <- subA

# Parasite load for B
parasite_l.B <- rep(NA, days)
parasite_l.B[1] <- subB

# While Loop for subject A and B
i <- 1
while (A.index.value > B.index.value) {
    parasite_l.A[i+1] <- A.index.value <- parasite_l.A[i]*(infA)
    parasite_l.B[i+1] <- B.index.value <-  parasite_l.B[i]*(infB)
    i <- i + 1
}

parasite_l.A
parasite_l.B

如果对(…){…}使用
,这是正确的答案
loop。如果我不清楚,很抱歉。我意识到我需要在条件中使用
break
语句。但是,我一定是写错了我的代码,因为我无法让它工作。你是否将此语句放在带有索引的for循环中?我就是这样尝试的
if(寄生虫A<寄生虫B){for(我在1:(天内)){parasite_l.A[i+1]=parasite_l.A[i]*(infA)parasite_l.B[i+1]=parasite_l.B[i]*(infB)}break
“for循环运行30天”-可能值得考虑一种不同的、比现有for循环更有效的方法。正如边注作为边注一样,
parasite_l.A
可以使用
subA*(infA^创建(0:days))
;但在这种情况下,将计算许多不需要的值,因为在计算之前不存在“中断”条件。感谢@alexis_laz!这对于在时间跨度内生成我想要的值来说效率更高。你说,“for循环运行30天,但我希望它在寄生虫_l.A的最后一个值大于寄生虫_l.B.时立即停止。”但您的意思是“小于”"否则函数将在第一个值处停止。A=400;B=120@PierreLafortune.感谢您捕获错误。我将修复它。这不会起作用,因为您正在
while
循环的
条件中使用向量。它将测试A的和与B的和。@PaulJames它只需要条件中的
I
在上。在条件中使用向量没有问题。另一方面,OP在其描述中是向后的。他们希望B大于a,而不是像所描述的那样。你是对的,你可以在
while
循环中使用向量,但我是对的,它将对向量求和。当你引用向量中的元素时对于索引,您使用的是特定元素作为条件,而不是整个向量。@PaulJames这也不是真的。它不会自动求和。请尝试
c(1:5)感谢@Pierrelaffortune提供的解决方案,以及在我的描述中捕捉到的错误,同时从我的编码中找出我真正想要的。这太棒了。我选择你的代码作为答案,因为它比PauiJames提供的更有效。感谢你的回答。我不知道在R.I中使用计数器的可能性t解决了问题,我只是标记了Pierre的解决方案,因为它更有效率。
# Subject A, initially 400 parasites, growing by 10 %
subA <- A.index.value <- 400
infA <- 1.1

# Subject B, initially 120 parasites, growing by 20 %
subB <- B.index.value <- 120
infB <- 1.2

# How many days to model
days <- 30

days_seq <- seq(1, days, 1)

# Parasite load for A
parasite_l.A <- rep(NA, days)
parasite_l.A[1] <- subA

# Parasite load for B
parasite_l.B <- rep(NA, days)
parasite_l.B[1] <- subB

# While Loop for subject A and B
i <- 1
while (A.index.value > B.index.value) {
    parasite_l.A[i+1] <- A.index.value <- parasite_l.A[i]*(infA)
    parasite_l.B[i+1] <- B.index.value <-  parasite_l.B[i]*(infB)
    i <- i + 1
}

parasite_l.A
parasite_l.B
> parasite_l.A
 [1]  400.00  440.00  484.00  532.40  585.64  644.20  708.62  779.49  857.44 943.18 1037.50
[12] 1141.25 1255.37 1380.91 1519.00      NA      NA      NA      NA      NA      NA      NA
[23]      NA      NA      NA      NA      NA      NA      NA      NA
> parasite_l.B
 [1]  120.00  144.00  172.80  207.36  248.83  298.60  358.32  429.98  515.98  619.17  743.01
[12]  891.61 1069.93 1283.92 1540.70      NA      NA      NA      NA      NA      NA      NA
[23]      NA      NA      NA      NA      NA      NA      NA      NA
>