R:如果满足条件,是否有办法在 for 循环中将索引设置回 1?
R: Is there a way to set the index back to 1 in a for loop if a condition is satisfied?
我想看看是否有一种方法可以在 R 中满足条件时重置 for 循环。
例如,如果我有一个虚拟数据集和参数:
# repeatable random numbers
set.seed(999)
# half-hourly time vector
t=seq(0,365,1/48)
# s vec initalized to zero
s = rep_len(0,length(t))
# set parameters
s[1] = 9 # initial value
s_max = 10.0
d = 1.5-cos(2*pi*(t-8/48)) + rlnorm(length(t))
c = 1.9-cos(2*pi*t) + rlnorm(length(t))
我有一个 for 循环,它执行我想要的操作,并在 s[i] < 0 时产生错误:
# time step
for (i in 1:(length(t)-1)) {
if (s[i] < 0) {
print("error: outage has occurred. Increase s_max")
break
}
if (c[i] > d[i]) {
if (s[i] < s_max) {
s[i+1] = s[i] + (c[i]-d[i]) # s increases
if (s[i+1] > s_max) {
s[i+1] = s_max
}
} else {
s[i+1] = s_max
}
} else {
if (s[i] > 0) {
s[i+1] = s[i] + (c[i]-d[i]) # s decreases
}
}
}
但是,如果失败了我就得自己增加s_max!所以我想知道是否有一种方法可以将 I 设置回 1 以再次开始循环并将 s_max 增加 1.
if (s[i] < 0) {
i = 1
s_max = s_max + 1}
等等..
但这似乎行不通!我想知道是否有一种方法或函数可以帮助解决这个问题。
这个例子应该是可复制的,所以请随意尝试!如果您有任何问题,请告诉我。
谢谢!
不,您不能在 for
循环中修改索引。您应该使用其他类型的循环。例如,
for (i in 1:(length(t)-1)) {
stuff
}
与
相同
i <- 0
while (i < (length(t) - 1)) {
i <- i + 1
stuff
}
除了你被允许在while
循环中修改i
。
我想看看是否有一种方法可以在 R 中满足条件时重置 for 循环。
例如,如果我有一个虚拟数据集和参数:
# repeatable random numbers
set.seed(999)
# half-hourly time vector
t=seq(0,365,1/48)
# s vec initalized to zero
s = rep_len(0,length(t))
# set parameters
s[1] = 9 # initial value
s_max = 10.0
d = 1.5-cos(2*pi*(t-8/48)) + rlnorm(length(t))
c = 1.9-cos(2*pi*t) + rlnorm(length(t))
我有一个 for 循环,它执行我想要的操作,并在 s[i] < 0 时产生错误:
# time step
for (i in 1:(length(t)-1)) {
if (s[i] < 0) {
print("error: outage has occurred. Increase s_max")
break
}
if (c[i] > d[i]) {
if (s[i] < s_max) {
s[i+1] = s[i] + (c[i]-d[i]) # s increases
if (s[i+1] > s_max) {
s[i+1] = s_max
}
} else {
s[i+1] = s_max
}
} else {
if (s[i] > 0) {
s[i+1] = s[i] + (c[i]-d[i]) # s decreases
}
}
}
但是,如果失败了我就得自己增加s_max!所以我想知道是否有一种方法可以将 I 设置回 1 以再次开始循环并将 s_max 增加 1.
if (s[i] < 0) {
i = 1
s_max = s_max + 1}
等等..
但这似乎行不通!我想知道是否有一种方法或函数可以帮助解决这个问题。
这个例子应该是可复制的,所以请随意尝试!如果您有任何问题,请告诉我。
谢谢!
不,您不能在 for
循环中修改索引。您应该使用其他类型的循环。例如,
for (i in 1:(length(t)-1)) {
stuff
}
与
相同i <- 0
while (i < (length(t) - 1)) {
i <- i + 1
stuff
}
除了你被允许在while
循环中修改i
。