Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is there a work around for slow performance of do.call(cbind.xts,...) in R 2.15.2?

Tags:

r

xts

I would expect cbind.xts and do.call(cbind.xts) to perform with similar elapsed time. That was true for R2.11, R2.14.

For R2.15.2 and xts 0.8-8, the do.call(cbind.xts,...) variant performs drastically slower, which effectively breaks my previous codes.

As Josh Ulrich notes in a comment below, the xts package maintainers are aware of this problem. In the meantime, is there a convenient work around?

Reproducible example:

library(xts)

secs <- function (rows, from = as.character(Sys.time()), cols = 1, by = 1) 
{
    deltas <- seq(from = 0, by = by, length.out = rows)
    nacol <- matrix(data = NA, ncol = cols, nrow = rows)
    xts(x = nacol, order.by = strptime(from, format = "%Y-%m-%d %X") + 
        deltas)
}

n <- 20
d1 <- secs(rows=n*100,cols=n)
d2 <- secs(rows=n*100,cols=n)

system.time(cbind.xts(d1,d2))

versus

system.time(do.call(cbind.xts, list(d1,d2)))
like image 228
Petr Matousu Avatar asked Dec 17 '12 22:12

Petr Matousu


1 Answers

One work-around is to set quote=TRUE in do.call.

R> system.time(cb <- cbind.xts(d1,d2))
   user  system elapsed 
  0.004   0.000   0.004 
R> system.time(dc <- do.call(cbind.xts, list(d1,d2), quote=TRUE))
   user  system elapsed 
  0.000   0.004   0.004 
R> identical(cb,dc)
[1] TRUE

The slowness is caused by do.call evaluating the arguments before evaluating the function call by default, which causes the call to be much larger. For example, compare these two calls:

call("cbind", d1, d2)                # huge
call("cbind", quote(d1), quote(d2))  # dainty
like image 190
Joshua Ulrich Avatar answered Oct 30 '22 05:10

Joshua Ulrich