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