title: Calculating XIRR using R
body: <p>I'm attempting to calculate IRR (internal rate of return) for non-periodic cashflows using R (similar to the Excel function named XIRR). The only problem is that it doesn't work. I sure could use some help in figuring out what's is going wrong..</p>
  
  <pre><code>R&gt;cashflow &lt;- c(275,275,275,275,275,275,275,275,275,275,275,275,416.833333333333,416.833333333333,416.833333333333,416.833333333333,416.833333333333,416.833333333333,416.833333333333,416.833333333333,416.833333333333,416.833333333333,416.833333333333,416.833333333333,452.666666666667,452.666666666667,452.666666666667,452.666666666667,452.666666666667,452.666666666667,452.666666666667,452.666666666667,452.666666666667,452.666666666667,452.666666666667,452.666666666667,534.583333333333,534.583333333333,534.583333333333,534.583333333333,534.583333333333,534.583333333333,534.583333333333,534.583333333333,534.583333333333,534.583333333333,534.583333333333,534.583333333333,-9246.969046)
  R&gt;dates &lt;- c("1997-01-31","1997-02-28","1997-03-31","1997-04-30","1997-05-31","1997-06-30","1997-07-31","1997-08-31","1997-09-30","1997-10-31","1997-11-30","1997-12-31","1998-01-31","1998-02-28","1998-03-31","1998-04-30","1998-05-31","1998-06-30","1998-07-31","1998-08-31","1998-09-30","1998-10-31","1998-11-30","1998-12-31","1999-01-31","1999-02-28","1999-03-31","1999-04-30","1999-05-31","1999-06-30","1999-07-31","1999-08-31","1999-09-30","1999-10-31","1999-11-30","1999-12-31","2000-01-31","2000-02-29","2000-03-31","2000-04-30","2000-05-31","2000-06-30","2000-07-31","2000-08-31","2000-09-30","2000-10-31","2000-11-30","2000-12-31","2001-01-31")
  
  R&gt;irr &lt;- xirr(cashflow, dates)
  </code></pre>
  
  <p>it throws the error :</p>
  
  <p><code>Error in while (pchg &gt;= tol &amp; abs(fval) &gt; tol &amp; iter &lt;= itmax) { : 
    missing value where TRUE/FALSE needed</code></p>
  
  <p>Here's the function:</p>
  
  <pre><code>xirr &lt;- function(cf, dates) {
  
   # Secant method.
  secant &lt;- function(par, fn, tol=1.e-07, itmax = 100, trace=FALSE, ...) { 
      # par = a starting vector with 2 starting values 
      # fn = a function whose first argument is the variable of interest 
      if (length(par) != 2) stop("You must specify a starting parameter vector of length 2") 
      p.2 &lt;- par[1] 
      p.1 &lt;- par[2] 
      f &lt;- rep(NA, length(par)) 
      f[1] &lt;- fn(p.1, ...) 
      f[2] &lt;- fn(p.2, ...) 
      iter &lt;- 1 
      pchg &lt;- abs(p.2 - p.1) 
      fval &lt;- f[2] 
      if (trace) cat("par: ", par, "fval: ", f, "\n") 
      while (pchg &gt;= tol &amp; abs(fval) &gt; tol &amp; iter &lt;= itmax) { 
          p.new &lt;- p.2 - (p.2 - p.1) * f[2] / (f[2] - f[1]) 
          pchg &lt;- abs(p.new - p.2) 
          fval &lt;- fn(p.new, ...) 
          p.1 &lt;- p.2 
          p.2 &lt;- p.new 
          f[1] &lt;- f[2] 
          f[2] &lt;- fval 
          iter &lt;- iter + 1 
          if (trace) cat("par: ", p.new, "fval: ", fval, "\n") 
      } 
      list(par = p.new, value = fval, iter=iter) 
  } 
  
  # Net present value.
  npv &lt;- function(irr, cashflow, times) sum(cashflow / (1 + irr)^times) 
  
  times &lt;- as.numeric(difftime(dates, dates[1], units="days"))/365.24 
  
  r &lt;- secant(par=c(0,0.1), fn=npv, cashflow=cf, times=times) 
  
  return(r$par)
  }
  </code></pre>