【问题标题】:How can I make a loop skip over inputs that generate warnings?如何使循环跳过生成警告的输入?
【发布时间】:2020-09-12 18:41:54
【问题描述】:

我正在对一组数据集运行一个复杂的函数(使用 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 分钟,所以我想在第一次警告时将其切断。)

【问题讨论】:

标签: r exception error-handling suppress-warnings imputation


【解决方案1】:

这个怎么办: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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-08
    • 2013-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-02
    • 2012-09-29
    相关资源
    最近更新 更多