在R中计算IRR时如何合并if语句?

问题描述 投票:3回答:3

这是我用来计算IRR的一个简单函数。但是,当所有现金流为负并且返回“未解除错误(npv,c(0,1),cf = cf)时,有一些事件发生:f()值不是符号相反的终点。”有什么方法可以把if语句放在一起,这样当IRR无法计算时,R只返回0?

npv<-function(i,cf,t=seq(along=cf)) sum (cf/(1+i)^t)
irr <- function(cf) {uniroot(npv, c(0,1), cf=cf)$root }
irr(cf)
r if-statement irr
3个回答
4
投票

你可以使用all函数:

irr <- function(cf) {
              if(all(cf < 0)) return(0)
              uniroot(npv, c(0,1), cf=cf)$root
       }
  • 如果all函数返回TRUE,则return函数将返回0,然后退出该函数。
  • 如果all函数返回FALSE,那么uniroot函数将像以前一样运行。

1
投票

我应该提一下,即使在接受的答案之后,你的函数似乎也包含一个小错误:

npv<-function(i,cf,t=seq(along=cf)) sum (cf/(1+i)^t)
irr <- function(cf) {
    if(all(cf < 0)) return(0)
    uniroot(npv, c(0,1), cf=cf)$root
}

考虑这个例子:

> npv(c(-123400, 36200, 54800, 48100), i = 0.025)
[1] 8528.911

问题是t=seq(along=cf)的默认值会让你对1:4的现金流量进行贴现。由于-123400的初始现金流出通常被视为PV,因此您最终会因折扣而不同步。

这应该解决问题:

npv<-function(i,cf,t=seq(along=cf)-1) sum (cf/(1+i)^t)

给你这个:

> npv(c(-123400, 36200, 54800, 48100), i = 0.025)
[1] 8742.134

但通常我会使用financialFinCal来计算IRR或NPV(或MIRR):

> require(financial)
> cf(c(-123400, 36200, 54800, 48100), i = 2.5)

Cash Flow Model

Flows:
      1       2       3       4 
-123400   36200   54800   48100 

 IRR%: 5.96 
 NPV Extremes at I%:  

   I%     NPV     NFV     NUS
1 2.5 8742.13 9414.32 3060.95

> require(FinCal)
> npv(c(-123400, 36200, 54800, 48100), r = 0.025)
[1] 8742.134
> irr(c(-123400, 36200, 54800, 48100))
[1] 0.05959787

0
投票

在所有现金流为零的情况下,IRR可能会失败。为了满足这些场景中的每一个,您可能希望tryCatchthe错误,而不是。

npv<-function(i,cf,t=seq(along=cf)) sum (cf/(1+i)^t)
irr <- function(cf) {tryCatch(uniroot(npv, c(0,1), cf=cf)$root,
         error=function(e) return(NA))
        }

irr(cf)
© www.soinside.com 2019 - 2024. All rights reserved.