genFunTimer =
function()
{
startTime = NULL
times = numeric()
start = function()
startTime <<- Sys.time()
end = function()
times[[ length(times) + 1L ]] <<- Sys.time() - startTime
invisible(list(start = start, end = end, times = function() times, reset = function() times <<- numeric()))
}
timeFun =
function(fun, tmr = genFunTimer(), where = globalenv(), print = FALSE, character.only = FALSE, ...)
{
funName = if(character.only)
fun
else
as.character(substitute(fun))
trace(funName, tmr$start, exit = tmr$end, print = print, ..., where = where)
tmr
}
timeFunMulti =
function(fun, tmr = genFunTimer(), where = globalenv(), print = FALSE, ncalls = NULL, ...)
{
if(length(ncalls))
ncalls = structure(rep(0L, length(fun)), names = fun)
timers = mapply(timeFun, fun, ncalls, MoreArgs = list(where = where, print = print, ..., character.only = TRUE))
# timers = lapply(fun, timeFun, where = where, print = print, ..., character.only = TRUE)
names(timers) = fun
function()
lapply(timers, function(x) x$times())
}
######################################
genMultiFunTimer =
function(funNames, ncalls = NULL)
{
nfuns = length(funNames)
startTime = NULL
# numeric vector won't work. Need the class POSIXct
reset = function()
startTime <<- structure(vector("list", nfuns), names = funNames)
reset()
times = structure(vector("list", nfuns), names = funNames)
start = function(fun) {
startTime[[fun]] <<- Sys.time()
}
end = function(fun) {
times[[fun]] [ length(times[[fun]]) + 1L ] <<- Sys.time() - startTime[[fun]]
}
list(start = start, end = end, times = function() times, reset = reset)
}
timeFunMulti2 =
function(funNames, tmr = genMultiFunTimer(funNames, ncalls), where = globalenv(), print = FALSE,
ncalls = NULL, ...)
{
for(i in funNames) {
if(FALSE) {
start = substitute(fun(funName), list(fun = tmr$start, funName = i))
end = substitute(fun(funName), list(fun = tmr$end, funName = i))
} else {
# force(start); force(end)
start = quote(f(name))
start[c(1, 2)] = list(tmr$start, i)
end = quote(f(name))
end[c(1, 2)] = list(tmr$end, i)
}
# browser()
trace(i, start, exit = end, print = print, ..., where = where)
}
tmr
}
#lapply(funNames, function(i) {
# start = substitute(fun(funName), list(fun = tmr$start, funName = i))
# end = substitute(fun(funName), list(fun = tmr$end, funName = i))
# trace(i, start, exit = end, print = print, ..., where = where)
#})
##############################
if(FALSE) {
tmr = timeFun(model.matrix)
lm(mpg ~ . , mtcars)
tmr$times()
invisible(replicate(10, lm(mpg ~ . , mtcars)))
tmr$times()
N = 10
xx = replicate(N, rnorm(rpois(1, 4000)), simplify = FALSE)
a = function(val) {Sys.sleep(1); median(val [ val > -1 & val < 1 ])}
atmr = genFunTimer()
#trace(a, tmr$start, print = FALSE)
#trace(a, quote({tmr$start(); on.exit(tmr$end)}), print = FALSE)
trace(a, atmr$start, exit = atmr$end, print = FALSE)
lapply(xx[1:4], a)
untrace(a)
}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.