如何封装函数实现R语言函数的执行起止时间与名称追踪?
解决函数执行追踪的封装问题
问题原因
你封装的mf_on_exit_start函数中,on.exit()默认绑定在自身的执行环境上。这意味着mf_on_exit_start执行完毕后会立刻触发结束信息输出,而非等待调用它的abcdef函数执行完成,导致追踪逻辑失效。
解决方案
需要将on.exit()的回调函数注册到调用者的执行环境(即abcdef的运行环境)中,确保在abcdef函数退出时才触发结束信息。可以通过parent.frame()获取调用者环境,并指定on.exit的envir参数实现。
修正后的代码
mf_on_exit_start <- function(match_call = match.call()) { # 获取调用当前函数的父环境(调用者函数的执行环境) caller_env <- parent.frame() # 输出函数开始执行信息 cat(paste("\n function started:", match_call, "\n ", Sys.time(), "\n")) # 在调用者环境中注册退出回调 on.exit({ cat(paste("\n function finished:", match_call, "\n ", Sys.time(), "\n")) }, envir = caller_env) } abcdef <- function() { mf_on_exit_start(match.call()) Sys.sleep(2) } # 测试执行 abcdef()
执行效果
运行abcdef()后,会先输出函数开始执行的信息,等待2秒后,再输出函数结束执行的信息,和你最初实现的abcde函数效果完全一致。
内容的提问来源于stack exchange,提问作者Masoud
相关产品推荐
相关产品推荐

