在以下示例中,我创建了add_timing
函数运算符。输入是一个函数(比如mean
),它返回一个与 执行相同操作的函数mean
,但会报告函数完成所需的时间。请参见以下示例:
library(pryr)
add_timing = function(input_function, specific_info) {
if (missing(specific_info)) specific_info = function(l) 'That'
function(...) {
relevant_value = specific_info(list(...))
start_time = Sys.time()
res = input_function(...)
cat(sprintf('%s took', relevant_value), difftime(Sys.time(), start_time, units = 'secs'), 'sec', '\n')
res
}
}
timed_mean = add_timing(mean)
# > timed_mean(runif(10000000))
# That took 0.4284899 sec
# [1] 0.4999762
接下来我尝试使用pryr::compose
创建相同的timed_mean
函数(我喜欢语法):
timed_mean_composed = pryr::compose(add_timing, mean)
但这确实为我提供了所需的输出:
# > timed_mean_composed(runif(100))
# function(...) {
# relevant_value = specific_info(list(...))
# start_time = Sys.time()
# res = input_function(...)
# cat(sprintf('%s took', relevant_value), difftime(Sys.time(), start_time, units = 'secs'), 'sec', '\n')
# res
# }
似乎 compose 操作并没有导致add_timing
函数实际被执行。只有在调用函数之后,new才timed_mean_compose
真正显示正确的函数输出。
根据@HadleyWickham 的 Advanced R 中的以下示例,我希望它在我使用它时能够正常工作(请参阅下面的摘录):
dot_every <- function(n, f) {
i <- 1
function(...) {
if (i %% n == 0) cat(".")
i <<- i + 1
f(...)
}
}
download <- pryr::compose(
partial(dot_every, 10),
memoise,
partial(delay_by, 1),
download_file
)
函数dot_every
运算符的使用方式与我add_timing
上面使用的方式相同。
我错过了什么?