在下面的示例中,我創建了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
# }
看來撰寫操作不會導致實際執行的add_timing
函數。只有在調用該函數之後,新的timed_mean_compose
纔會顯示正確的函數輸出。
通過@HadleyWickham基礎上following example從先進的R I預計這個工作,我用它(請參閱下面的摘錄):
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
。
我錯過了什麼?
感謝您的反饋意見。我的問題是爲什麼'dot_every'功能工廠確實工作,而我的工作沒有。 –
@PaulHiemstra我認爲我會遠離'dot_every'這個例子,因爲考慮到使用'partial'和'dot_every'使用賦值到一個函數環境的事實,這裏有很多事情要做。這是相當模糊的;作爲例子,運行:'f < - dot_every(3,mean);環境(F)$ I; F(1); F(1); F(1);環境(F)$ i' – Thomas