2012-12-17 43 views
9

我期望cbind.xtsdo.call(cbind.xts)以相似的經過時間執行。 對於R2.11,R2.14來說是這樣。R 2.15.2中有沒有解決do.call(cbind.xts,...)性能低下的問題?

對於R2.15.2和XTS 0.8-8,該do.call(cbind.xts,...)變種進行大大慢,從而有效地打破我以前的代碼。

正如Josh Ulrich在下面的評論中指出的那樣,程序包維護人員意識到了這個問題。在此期間,有沒有方便的解決方法?

重複的例子:

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

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

Stackoverflow不是確認行爲的地方。您可以編輯您的問題以尋求解決方法。也就是說,我們意識到這一點,它與'do.call'(也可能是'cbind'和'rbind'的不尋常的方法分派)有關;它不是特定於xts。 –

+0

@JoshuaUlrich那麼誰知道呢? R核心團隊?或xts團隊?問題的細節是什麼?請提供更好的信息。 –

+0

@PetrMatousu:也許你應該知道你的軟件包維護者是誰。 –

回答

12

一個解決辦法是設置在quote=TRUEdo.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 

是緩慢的通過do.call評估由默認的函數調用,從而導致通話要大得多前評估的參數引起的。例如,比較這兩個調用:

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

謝謝。效果很好。 –

相關問題