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