这是我用来计算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)
你可以使用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
函数将像以前一样运行。我应该提一下,即使在接受的答案之后,你的函数似乎也包含一个小错误:
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
但通常我会使用financial
或FinCal
来计算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
在所有现金流为零的情况下,IRR可能会失败。为了满足这些场景中的每一个,您可能希望tryCatch
the错误,而不是。
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)