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

时间:2016-06-08 16:24:07

标签: r if-statement irr

这是我用来计算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)

3 个答案:

答案 0 :(得分:4)

您可以使用irr <- function(cf) { if(all(cf < 0)) return(0) uniroot(npv, c(0,1), cf=cf)$root } 功能:

all
  • 如果return函数返回TRUE,则all函数将返回0,然后退出该函数。
  • 如果uniroot函数返回FALSE,则overflow: hidden;函数将像以前一样运行。

答案 1 :(得分:1)

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

public class WorkoutManager{
    private static WorkoutManager instance;

    private WorkoutManager() {}

    private ArrayList<Workout> workouts = new ArrayList<>();

    public static WorkoutManager getInstance()
    {
        if (instance == null)
        {
            instance = new WorkoutManager();
        }
        return instance;
    }

    public ArrayList<Workout> getWorkouts(){
        return workouts;
    }

    public Workout getWorkout(int index){
        return workouts.get(index);
    }

    public void setWorkouts(ArrayList<Workout> workouts){
        this.workouts = workouts;
    }

    public void addWorkout(Workout workout){
        workouts.add(workout);
    }
}

考虑这个例子:

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的初始现金流出通常被视为PV,因此您最终会因折扣而不同步。

这应该解决问题:

-123400

给你这个:

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来计算IRR或NPV(或MIRR):

FinCal

答案 2 :(得分:0)

IRR可能在更多情况下失败,而不仅仅是在所有现金流为零时。为了满足每种情况,您可能需要tryCatch错误。

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)