profvis()包裹代码触发递归错误问题排查求助
问题分析求助:profvis包裹代码时触发递归错误
这段代码在被profvis()包裹运行时会报错:No more error handlers available (recursive errors?); invoking 'abort' restart,但单独运行代码块无此错误。初步怀疑问题与tryCatch()语句相关,求问题原因分析思路。
可复现代码
library(profvis) n_pred <- c(3,6,12) pref_prev <- c(0.3, 0.1, 0.01) scen_temp <- expand.grid(pref_prev = pref_prev, n_pred = n_pred) par_all <- matrix(NA, nrow = nrow(scen_temp), ncol = 2) par_init <- matrix(data = c(-1, 0.5, -2.5, 0.5, -5, 0.5, -1, 0.4, -2.5, 0.4, -5, 0.4, -1, 0.3, -2.5, 0.3, -5, 0.3), nrow = 9, ncol = 2, byrow = TRUE) profvis({ for (j in 1:nrow(par_all)) { par_sce <- matrix(NA, 10, 2) for (k in 1:10){ par_sce[k,] <- tryCatch({optimB(n_pred = scen_temp[j,2], pref_prev = scen_temp[j,1], par_init = par_init[j,], n = 5000)}, error = function(err) { err$message <- paste(err, "Using initial params instead.") par_init[j,] }) } par_all[j,] <- apply(par_sce, 2, median) } })
会话信息
- R版本:4.2.1 (2022-06-23)
- 平台:x86_64-apple-darwin17.0 (64-bit)
- 运行环境:macOS Ventura 13.0.1
- 矩阵运算:默认
- LAPACK路径:/Library/Frameworks/R.framework/Versions/4.2/Resources/lib/libRlapack.dylib
- 区域设置:
en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8 - 已加载基础包:stats、graphics、grDevices、utils、datasets、methods、base
- 已加载命名空间(未附着):compiler_4.2.1、magrittr_2.0.3、fastmap_1.1.0、cli_3.4.1、tools_4.2.1、rstudioapi_0.14、memoise_2.0.1、cachem_1.0.6、conflicted_1.1.0、rlang_1.0.6、purrr_0.3.5
问题原因分析思路
tryCatch错误处理函数触发递归错误:你在错误处理函数中直接修改了err$message,但在profvis的性能分析环境下,err对象可能存在特殊的引用限制,修改操作可能触发新的异常,而新异常又会进入当前tryCatch的处理流程,形成递归,最终耗尽R的错误处理器资源。建议修改错误处理逻辑,不要直接修改原err对象,改为拼接新信息后直接输出,比如:error = function(err) { message(paste(err$message, "Using initial params instead.")) par_init[j,] }- profvis的环境隔离干扰:profvis在运行时会创建独立的分析环境,
tryCatch错误处理函数中引用的外部变量(如par_init[j,])在该环境下可能无法正常解析,触发二次错误。可以尝试在错误处理函数中先打印变量值,确认是否能正常访问,或者将需要的变量提前通过闭包传入错误处理环境。 optimB函数的隐性异常:单独运行时tryCatch能处理optimB的错误,但profvis的profiling钩子可能改变了optimB的错误抛出行为,导致其抛出的错误类型无法被当前tryCatch捕获,进而引发错误溢出。建议先单独测试所有参数组合下optimB的错误情况,确认是否存在特殊异常类型。- 错误处理的嵌套逻辑问题:当
tryCatch的错误处理函数本身出错时,R会尝试调用上层错误处理器,若没有上层处理器则会触发递归错误提示。可以在外部额外嵌套一层tryCatch,捕获错误处理函数中的异常,定位具体的二次错误点。
内容的提问来源于stack exchange,提问作者latlio
相关产品推荐
相关产品推荐

