循环停止执行且没有错误以及如何在每次迭代后存储循环结果?

问题描述 投票:0回答:1

在尝试为我的 R 课程构建保险模型时,我发现 Rstudio 停止执行代码,没有给出任何错误。 例如,我有分配变量的部分:

payout_reserve <- probab/12*T*N*F
Result = W-payout_reserve
a <- (N*probab)/12 
St <- payout_reserve - ( a * F )

当它不包含在循环中时执行(运行选定的行),但是当它包含在循环中时不会执行(参见下面标记为粗体的代码):

K<-200 #monthly payment
F<-40000 #potential payout
T<-2 # no of months
probab<-0.03 # 3% probability of payout

#1st period
t<-1

#W=money inflow

**for (t in 1:T) {
    W <-K*N*T } 
#A
#simulation function:
simulation<-function(N, K, F, T,probab) {
 
  for (t in 1:T) {
payout_reserve <- probab/12*T*N*F
#difference between inflow and outflow
Result = W-payout_reserve
#B. number of payouts
a <- (N*probab)/12 
#C. insurance payout
St <- payout_reserve - ( a * F )**


  
#D. liquidity check
n <- sample(0:100, 1) #random number – new customers (0-100)
o <- sample(0:90, 1) #random number – resigning customers (0-100)




if(St>=0){
  print("sufficient liquidity")
  N=N+n-o-a
  } else if (St<0) {
  print ("no liquidity")
    stop("stop")
    }

#E. t=t+1
inc <- function(t) {eval.parent(substitute(t <- t + 1))}
inc(t)

#F. if 𝑡 ≤ 𝑇, go to point 2, otherwise exit
while (t <= T) {
  if(t == T){
    break
  }
next 
}
}
}

simulation(N=10000, K=200, F=30000, T=2,probab=0.03) 

你能告诉我发生了什么事吗?为什么循环不执行所有代码?

另外,您能否建议如何将迭代结果存储在列表中? 我想在每次迭代后得到一个 St 值列表......

r
1个回答
1
投票

有一些问题

  1. 在simulation()函数内部,使用了变量

    W
    ,但没有使用 定义在循环中。它是在外部的单独循环中定义的 函数 (W <- KNT),由于以下原因,它不适用于函数内部 范围界定。

  2. while (t <= T)
    循环可能导致无限循环,因为 t 不是 正确更新循环内。你应该直接增加 t 在
    for loop
    中而不是使用 while 循环。

  3. 下一条语句在 while 循环中放错了位置,这可能会 阻止循环按预期运行。

  4. 为了存储迭代结果,需要初始化一个列表(或者 另一个数据结构)在循环之外并向其附加 St 值 在每次迭代期间,然后使用

    return

    输出它
  5. 当流动性不足时,

    stop()
    函数会停止整个执行 不足的。如果这是故意的,那很好,但它会终止 整个模拟立即完成。

这是更正后的代码:

# Simulation function
simulation <- function(N, K, F, T, probab) {
  
  # Initialize variables
  t <- 1 # Start period
  W <- K * N * T # Initial money inflow
  St_values <- list() # List to store St values for each iteration
  
  for (t in 1:T) {
    # A. Payout reserve
    payout_reserve <- probab / 12 * T * N * F
    
    # B. Difference between inflow and outflow
    Result <- W - payout_reserve
    
    # C. Number of payouts
    a <- (N * probab) / 12
    
    # D. Insurance payout
    St <- payout_reserve - (a * F)
    
    # Store `St` in the list
    St_values[[t]] <- St
    
    # E. Liquidity check
    n <- sample(0:100, 1) # Random new customers
    o <- sample(0:90, 1)  # Random resigning customers
    
    if (St >= 0) {
      print("sufficient liquidity")
      N <- N + n - o - a
    } else {
      print("no liquidity")
      stop("Simulation stopped due to insufficient liquidity.")
    }
    
    # F. Increment time (handled by the for loop)
  }
  
  # Return the list of St values
  return(St_values)
}

# Run the simulation
result <- simulation(N = 10000, K = 200, F = 30000, T = 2, probab = 0.03)


St_df <- data.frame(period = 1:length(result), St = unlist(result))
print(St_df)
© www.soinside.com 2019 - 2024. All rights reserved.