2016-08-02 45 views
3

有一些答案SO時間比較沒有檢查結果。但是,我更喜歡快速查看錶達式是否正確檢查microbenchmark結果失敗data.table更改通過引用

microbenchmark包支持check參數。不幸的是,檢查在通過引用改變data.table的表達方式上失敗,即檢查不能識別結果不同。

案例1:data.table表達,其中檢查工作正常

library(data.table) 
library(microbenchmark) 

# minimal data.table 1 col, 3 rows 
dt <- data.table(x = c(1, 1, 10)) 

# define check function as in example section of help(microbenchmark) 
my_check <- function(values) { 
    all(sapply(values[-1], function(x) identical(values[[1]], x))) 
} 

基準的情況下,被設計成返回不同的結果。因此,

microbenchmark(
    f1 = dt[, mean(x)], 
    f2 = dt[, median(x)], 
    check = my_check 
) 

返回按預期的錯誤消息:

Error: Input expressions are not equivalent.

情況2:其中檢查失敗

現在data.table表達式中,表達式被修改以引用的改變dt。請注意,使用相同的檢查功能。

microbenchmark(
    f1 = dt[, y := mean(x)], 
    f2 = dt[, y := median(x)], 
    check = my_check 
) 

回報現在

expr  min  lq  mean median  uq  max neval cld 
    f1 576.947 625.174 642.9820 640.7110 661.1870 732.391 100 a 
    f2 602.022 658.384 684.7076 678.9975 694.0825 978.600 100 b 

所以,對結果的檢查已在這裏失敗了,儘管兩人的表情不同。 (時間是無關緊要的。)

據我所知,檢查被確定失敗,因爲dt被引用改變。因此,在比較每個表達式的結果時,總是會在最後一次更改的狀態中引用同一個對象。

問題

如何我可以修改檢查功能和/或表達,以便可靠地檢查將檢測即使在data.table的情況不同,結果以參考文獻的改變?

回答

4

最簡單的方法是使用copy()

microbenchmark(
    f1 = copy(dt)[, y := mean(x)], 
    f2 = copy(dt)[, y := median(x)], 
    check = my_check, times=1L 
) 
# Error: Input expressions are not equivalent. 

添加copy(dt)進來會給花費在複印時的想法(如果有必要,一個總是可以減去從運行時間爲f1f2)。

microbenchmark(
    f1 = copy(dt)[, y := mean(x)], 
    f2 = copy(dt)[, y := median(x)], 
    f3 = copy(dt), 
    times=10L 
) 
# Unit: microseconds 
# expr  min  lq  mean median  uq  max neval cld 
# f1 298.690 306.508 331.6364 315.1400 347.788 414.264 10 b 
# f2 319.075 322.475 373.3873 329.3895 336.268 746.134 10 b 
# f3 19.180 19.750 28.3504 25.1745 26.111 70.016 10 a 
+1

非常感謝您,這是一個簡單明瞭的解決方案,簡潔易用。 +2的提示單獨測試'copy()'。 – Uwe