定义命令启动的回调

时间:2014-11-25 14:43:35

标签: r

我正在尝试自动执行所有顶级表达式。 Task Handlers几乎是所需要的,但只有在命令完成后才会调用它们,而不是之前。

另一种方法是修改要包含在system.time中的每个顶级表达式,但是我不知道这样做的方法。

3 个答案:

答案 0 :(得分:8)

为了完整性,这里有一个函数,您可以将其用作任务回调,以自动为任何需要超过5秒的顶级命令发出系统通知。

# devtools::install_github("gaborcsardi/notifier")
notify_long_running <- function(second_cutoff = 5) {
  last <- proc.time()[1]
  function(expr, value, ok, visible) {
    duration <- proc.time()[1] - last
    if (duration > second_cutoff) {
      notifier::notify(msg = paste0(collapse = " ", deparse(expr)),
                       title = sprintf("Completed in %.02f (s)", duration))
    }
    last <<- proc.time()[1]
    TRUE
  }
}

addTaskCallback(notify_long_running())

答案 1 :(得分:2)

迟了两年,但尝试使用此解决方案自动计时所有命令:

proc <- function(...) {
    utime <- proc.time()[1]
    utime_diff <- utime-get0(".prev_time", envir=globalenv(), ifnotfound=0)
    options(prompt=paste0(utime_diff,"s> "))
    assign(".prev_time", utime, envir=globalenv())
    return(TRUE)
    }
ret <- addTaskCallback(proc)

proc.time返回的“用户时间”在空闲时不会增加,因此它只会计算运行命令所花费的时间。

这使你非常接近准确的测量,至少到10秒:

start_time <- proc.time()[1]

st_time <- system.time({for(x in 1:10000000) {
    log(x)
}})[1]

pt_time <- proc.time()[1] - start_time

print(paste("time using proc.time()", pt_time))
print(paste("time using syste.time()", st_time))

“时间使用proc.time()1.908”

“时间使用syste.time()1.884”

答案 2 :(得分:-2)

没有真正的方法来分析“顶级命令”,因为R不知道那些是什么。你是如何定义它们的?

如果system.time对你来说不够精细(因为它没有查看单个代码片段),我的建议是反方向并使用Rprof,这样你就可以开始并停止表达式的时间,并在输出(summaryRprof())上按函数调用打印细分。请注意,这是通过函数调用,而不是通过“顶级函数”调用:如果您正在寻找R来基准您认为是顶级函数的基准,{{1可能确实是你最好的选择