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