我在数据集列表上运行了一个复杂的函数(使用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/