r - 如何使循环跳过产生警告的输入?

标签 r exception error-handling suppress-warnings imputation

我在数据集列表上运行了一个复杂的函数(使用Amelia进行多重插补)。每隔一段时间,数据集就会触发一长串警告,最终导致错误。我希望R在发出第一个警告后就放弃并继续进行下一个数据集。这是一个最小的工作示例:

df.list <- list(
  data.frame(1:4), 
  data.frame(-1, -2,  -4), 
  data.frame(10:15)
)

for(df in df.list){
  ans <- sum(sapply(df, sqrt))
  print(ans)
}

该脚本发出有关NaN的三个警告,然后打印:
[1] 6.146264
[1] NaN
[1] 21.1632

我希望它产生1条消息input 2 failed,然后仅输出有效结果:
[1] 6.146264
[1] 21.1632

(我实际上正在运行的函数amelia()在发出最终错误之前会发出警告10分钟,所以我想在第一次警告时将其切断。)

最佳答案

怎么办:sqrt函数无法返回-1,所以当发生警告时,我使tryCatch返回-1。需要嵌套lapply遍历列表元素以计算平方根,并作为列表返回,然后遍历这些列表元素求和。结果中的-1值表示计算失败,我可以对其进行测试。

result <- unlist(
  lapply(
    lapply(df.list, function(x) tryCatch(sqrt(x), warning = function(w) -1)), sum))
failed <- which(result == -1)
result <- result[-failed]
print(paste0("input ", failed, " failed"))
result

> print(paste0("input ", failed, " failed"))
[1] "input 2 failed"
> result
[1]  6.146264 21.163196

关于r - 如何使循环跳过产生警告的输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62014060/

相关文章:

r - 多变量 Mann-Whitney U 检验

r - 覆盖 R 对象时如何管理内存?

r - 在两个或多个变量上使用 Melt() 时,如何保留串联变量的两个部分? (数据.表::熔化())

python - 如何用子进程捕获 FFMPEG 异常?

python - 退出失败的脚本运行(python)

java - 在 Java 中处理运行时异常的正确方法

r - 更改 ggplot2 中条形图的绘制顺序

当抛出错误时,R 以不可见的方式返回对象和正常错误

jquery - img错误事件未按预期运行

asp.net-mvc-3 - 服务器2008年global.asax MVC 3.0问题中的错误处理