我有此功能,可以计算非定期现金流量的内部收益率。

xirr <- function(cf, t) {
    npv <- function(cf, t, r) sum(cf/((r)^(t/365.25)))
    irr <- uniroot(f=npv, interval=c(0,10), cf=cf, t=t, maxiter=100)$root - 1
    return(irr)
}

问题是,如果现金流量的收益小于-100%,则无法满足该公式的数学假设。即使没有满足这些假设,我也需要函数NOT STOP(引发错误)。发生这种情况时,我需要它返回0或其他值。现在..
 mycashflow <- c(2000, 2000, 3000,4000, -10000)
 mydates <-as.integer( c(0,101,200,300,400))

 xirr(mycashflow, mydates)

..它引发错误:
Error in uniroot(f = npv, interval = c(0, 10), cf = cf, t = t, maxiter = 100) : f.lower = f(lower) is NA

最佳答案

尝试捕获错误并直接返回:

xirr <- function(cf, t) {
    npv <- function(cf, t, r) sum(cf/((r)^(t/365.25)))
    tryCatch(
      irr <- uniroot(f=npv, interval=c(0,10), cf=cf, t=t, maxiter=100)$root - 1,
      error=return(0)
    )
    return(irr)
}

关于r - 如果不满足假设,如何避免单根函数停止?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14335729/

10-12 23:33