2012-12-17 14 views
9

Ich würde erwarten, cbind.xts und do.call(cbind.xts) mit ähnlich verstrichener Zeit durchzuführen. Das galt für R2.11, R2.14.Gibt es eine Arbeit für die langsame Ausführung von do.call (cbind.xts, ...) in R 2.15.2?

Für R2.15.2 und xts 0,8-8 führt die do.call(cbind.xts,...) Variante drastisch langsamer, was meine früheren Codes effektiv bricht.

Wie Josh Ulrich in einem Kommentar unten bemerkt, sind die xts Paketbetreuer dieses Problems bekannt. Gibt es in der Zwischenzeit eine bequeme Arbeit?

Reproduzierbare Beispiel:

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

gegen

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

Stackoverflow ist nicht der Ort, um Verhalten zu bestätigen. Sie können Ihre Frage bearbeiten, um nach einem Workaround zu fragen. Wir sind uns dessen bewusst und es hat mit "do.call" zu tun (und vielleicht mit der ungewöhnlichen Methode "cbind" und "rbind"); es ist nicht spezifisch für xts. –

+0

@JoshuaUlrich Nun, wer ist sich dessen bewusst? R-Kern-Team? Oder XTS-Team? Was sind die Details des Problems? Bitte geben Sie bessere Informationen an. –

+0

@PetrMatousu: Vielleicht sollten Sie erfahren, wer Ihre Paketbetreuer sind. –

Antwort

12

Ein Work-around ist quote=TRUE in do.call einzustellen.

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 

Die Langsamkeit wird durch do.call veranlaßt, die Argumente Auswertung vor den Funktionsaufruf von Standard Auswertung, die den Anruf viel größer sein verursacht. Vergleichen Sie beispielsweise diese beiden Aufrufe:

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

Danke. Funktioniert gut. –