SO 有一些答案,其中比较了时间without检查结果。不过,我更喜欢看看表达式是否正确and fast.
The microbenchmark
包支持这一点check
范围。不幸的是,对改变 a 的表达式的检查失败data.table
引用,即检查无法识别结果不同。
情况 1:data.table 表达式,其中 check 按预期工作
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
)
按预期返回错误消息:
错误:输入表达式不等效。
情况 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
因此,尽管这两个表达式对结果的检查在这里失败了are不同的。 (时间无关紧要。)
我了解检查确定失败是因为dt
通过引用更改。因此,当比较每个表达式的结果时,总是在最后更改的状态下引用相同的对象。
Question
如何修改检查函数和/或表达式,以便即使在出现以下情况时检查也能可靠地检测到不同的结果data.table
通过引用改变?