如何在R中自动统计顶层代码块执行时间或打印运行时间?
R顶层代码块自动计时/打印时间实现方案
完全可以通过.Rprofile全局配置实现需求,无需提前包裹代码,也不需要强制通过source()执行脚本,适配RStudio交互式运行场景,仅对顶层代码块生效,不会统计内部函数执行信息。
方案1:最简实现-自动打印执行结束时间
仅需每次顶层代码运行完成后打印当前时间,操作步骤如下:
- 在RStudio控制台运行
usethis::edit_r_profile()打开全局配置文件 - 将以下代码粘贴到配置文件末尾,保存后重启R会话即可生效
# 适配RStudio的自动打印时间回调 setHook("rstudio.sessionInit", function(...) { .addTaskCallback(function(expr, value, ok, visible) { cat("代码块执行完成时间:", format(Sys.time(), "%Y-%m-%d %H:%M:%S"), "\n\n") return(TRUE) }, name = "auto_print_time") }, action = "append")
此后无论是在控制台逐行执行代码,还是选中编辑器内的代码块批量运行,执行完成后都会自动打印结束时间。
方案2:进阶实现-自动统计代码块执行耗时
如果需要粗略估算代码块的执行时长,可以使用带耗时统计的配置,步骤同方案1,粘贴以下代码到.Rprofile即可:
setHook("rstudio.sessionInit", function(...) { # 用于存储代码块启动时间的私有环境 .task_time_env <- new.env(parent = emptyenv()) tcm <- getTaskCallbackManager() # 代码块启动前记录时间 tcm$add(function(expr, value, ok, visible) { .task_time_env$start <- Sys.time() return(TRUE) }, name = "record_start", event = "before.task") # 代码块结束后计算并打印耗时+结束时间 tcm$add(function(expr, value, ok, visible) { cost <- as.numeric(difftime(Sys.time(), .task_time_env$start, units = "secs")) cat(sprintf("代码块执行耗时:%.2f秒 | 结束时间:%s\n\n", cost, format(Sys.time(), "%H:%M:%S"))) return(TRUE) }, name = "calc_cost", event = "after.task") }, action = "append")
该方案可以直接输出整个顶层代码块的总耗时,例如你给出的dplyr链式代码,运行后只会打印整段代码的总耗时,不会对group_by、summarise等内部函数单独统计,完全匹配需求。
注意事项
- 若不需要该功能时,可直接删除
.Rprofile中的对应代码,重启R即可恢复 - 临时关闭功能可在控制台运行
removeTaskCallback("auto_print_time")(方案1)或对应回调名称即可 - 若需要在非RStudio的R环境中生效,删除外层的
setHook("rstudio.sessionInit", function(...){})包裹即可
内容的提问来源于stack exchange,提问作者user63230
相关产品推荐
相关产品推荐

