使用purrr::map时保留计算结果同时存储警告信息的方法
自定义possibly函数同时保留警告与计算结果
修改后的实现代码
input <- list(10, -1 , "A") possibly2 <- function(.f) { .f <- purrr::as_mapper(.f) function(...) { warn_msg <- NULL # 捕获警告并保留计算结果 result <- withCallingHandlers( .f(...), warning = function(w) { warn_msg <<- paste0("Warning: ", w$message) invokeRestart("muffleWarning") } ) # 处理错误并统一输出结构 tryCatch( { if (!is.null(warn_msg)) { list(result = result, warning = warn_msg) } else { result } }, error = function(e) { list(error = paste0("Error: ", e$message)) } ) } } safer_log <- possibly2(.f = log) map(input, safer_log) %>% set_names(c("1. good input", "2. warning", "3. error"))
运行结果
$`1. good input` [1] 2.302585 $`2. warning` $`2. warning`$result [1] NaN $`2. warning`$warning [1] "Warning: NaNs produced" $`3. error` $`3. error`$error [1] "Error: non-numeric argument to mathematical function"
关键修改说明
- 替换原
tryCatch的警告处理逻辑:使用withCallingHandlers捕获警告,它不会像tryCatch那样中断函数执行,因此能保留函数的计算结果。 - 用
invokeRestart("muffleWarning")抑制警告的控制台输出,将警告信息存入变量统一管理。 - 统一输出结构:
- 无错误无警告时,直接返回函数计算结果;
- 有警告时,返回包含
result(计算结果)和warning(警告信息)的列表; - 发生错误时,返回包含
error(错误信息)的列表,方便后续批量处理结果。
内容的提问来源于stack exchange,提问作者Rasul89
相关产品推荐
相关产品推荐

