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

问题描述 投票:1回答:1

我正在一系列数据集上运行复杂的函数(使用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个回答
0
投票

有关此内容: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
© www.soinside.com 2019 - 2024. All rights reserved.