首页 > 解决方案 > 使用存储的计算中的列表编写函数

问题描述

我正在尝试为 CLV 编写一个函数,它将每年的值(索引为 0 到 t)存储在一个列表中并对列表求和。是)我有的:

CLV_simple <- function (r, t, M, Alpha){
  CLV = list()
  for (i in 0:t){
    CLV[i] <-  M*(Alpha/(1+r))^i
    return(sum(CLV))
  }
}
CLV_simple(.10, 4, M, Alpha)

其中 CLV[0] = M*(Alpha/(1+r))^0,CLV[1] = M*(Alpha/(1+r))^1,以此类推 CLV[4]。

Alpha 和 M 之前被定义为变量。假设 Alpha 为 0.81,M 为 40.23

回报应该是每年的总和,或者:

(M*(Alpha/(1+.10))^0) + (M*(Alpha/(1+.10))^1) + (M*(Alpha/(1+.10))^2) + (M*(Alpha/(1+.10))^3) + (M*(Alpha/(1+.10))^4)

[1] 121.4646

当我运行我的函数时,我得到的是:

CLV_simple(.10, 4, M, Alpha)
list()

所以有些东西没有被保存到列表中,我不知道为什么。

标签: rfunctionfor-loop

解决方案


在您的代码中,

  1. return使您的代码在第一次迭代后跳出for循环。您应该移动returnfor完成循环的函数体的末尾。
  2. 此外,i是访问的索引CLV,它应该从而1不是0从开始0:t
  3. 还有一件事,CLV应该初始化为c(),因为里面的元素list()不能直接求和。

您可以尝试for如下循环

CLV_simple <- function (r, t, M, Alpha){
  CLV <- c()
  for (i in 0:t){
    CLV[i+1] <-  M*(Alpha/(1+r))^i  
  }
  return(sum(CLV))
}

或更简单的

CLV_simple2 <- function(r,t,M,Alpha) sum(M*(Alpha/(1+r))^(0:t))

推荐阅读