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
>