Search code examples
rmulticorexts

Multivariate XTS as argument works with lapply but not mclapply


I have a function which works with lapply but returns an error if I try it with mclapply. The argument to the function is a multivariate XTS. Here is a sample:

library(quantmod)
library(doMC)
registerDoMC(4)

test <- function(x){
  return(mean(x))
}

myEnv <- new.env()
getSymbols(c("^GSPC", "^RUT"), env=myEnv)
data <- do.call(merge, c(eapply(myEnv, Ad), all=TRUE))

lapply(data, test)
mclapply(data, test)

lapply returns the results as expected but mclapply returns:

Error in `[.xts`(X, seq(i, length(X), by = cores)) : 
  subscript out of bounds

Can someone help me out here? Thanks.

Session Info

R version 2.15.2 (2012-10-26)
Platform: x86_64-apple-darwin9.8.0/x86_64 (64-bit)

locale:
[1] en_GB.UTF-8/en_GB.UTF-8/en_GB.UTF-8/C/en_GB.UTF-8/en_GB.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] doMC_1.2.5      multicore_0.1-7 iterators_1.0.6 foreach_1.4.0   quantmod_0.3-22 TTR_0.21-1      xts_0.9-0       zoo_1.7-9      
[9] Defaults_1.1-1 

loaded via a namespace (and not attached):
[1] codetools_0.2-8 grid_2.15.2     lattice_0.20-10 Rcpp_0.9.15     tools_2.15.2   

Solution

  • xts objects are funny in the sense that:

    length(data)
    # [1] 3010
    data[3010]
    # Error in `[.xts`(data, 3010) : subscript out of bounds
    

    and that, mclapply does not like...

    You'll find that mclapply(as.list(data), test) will work, although the documentation says:

    X: a vector (atomic or list) or an expressions vector. Other objects (including classed objects) will be coerced by as.list.

    Go figure... It's probably worth mentioning to the authors.