2012-12-17 10 views
9

Mi aspetto che cbind.xts e do.call(cbind.xts) eseguano con un tempo trascorso simile. Questo era vero per R2.11, R2.14.Esiste un problema con le prestazioni lente di do.call (cbind.xts, ...) in R 2.15.2?

Per R2.15.2 e XTS 0,8-8, la variante do.call(cbind.xts,...) esegue drasticamente più lento, che rompe in modo efficace i miei codici precedenti.

Come osserva Josh Ulrich in un commento di seguito, i manutentori del pacchetto xts sono a conoscenza di questo problema. Nel frattempo, c'è un lavoro conveniente in giro?

esempio riproducibile:

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)) 

contro

system.time(do.call(cbind.xts, list(d1,d2))) 
+0

Stackoverflow non è il luogo per confermare il comportamento. Potresti modificare la tua domanda per chiedere una soluzione. Detto questo, siamo consapevoli di questo e ha a che fare con 'do.call' (e forse l'insolito metodo di invio di' cbind' e 'rbind'); non è specifico per xts. –

+0

@JoshuaUlrich Bene, chi ne è a conoscenza? Team R-core? O squadra xts? Quali sono i dettagli del problema? Si prega di fornire informazioni migliori. –

+0

@PetrMatousu: Forse dovresti sapere chi sono i manutentori dei pacchetti. –

risposta

12

Un work-around è quello di impostare 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 

La lentezza è causato da do.call valutando gli argomenti prima di valutare la chiamata di funzione di default, che provoca la chiamata ad essere molto più grande. Ad esempio, confrontare queste due chiamate:

call("cbind", d1, d2)    # huge 
call("cbind", quote(d1), quote(d2)) # dainty 
+0

Grazie. Funziona bene. –

Problemi correlati