如何将警告消息保存在循环内的向量或数据框中,以便它们可以与特定的迭代相关联?
这是一个玩具示例,我想在数据框(log(k)
)中的操作(k
)中存储结果和警告消息(如果有):
dat <- data.frame(k=c(3,5,-2,7), logk=NA, warnMsg=NA)
for(i in 1:nrow(dat)){
w <- length(warnings())
dat$logk[i] <- log(dat$k[i])
#if new warning, assign to data frame
if(length(warnings()) > length (w)){
dat$warnMsg[i] <- warnings()[length(warnings())]
}
}
似乎这不起作用,因为在循环结束之前,warnings()
调用无法在循环内生成任何警告。我是否需要指定不同的环境来访问循环中的新警告?
我怀疑使用try()
或tryCatch()
完全执行此操作还有更好的方法,但对我来说这一点并不明显。
答案 0 :(得分:4)
您可以使用withCallingHandlers
功能完成所需的操作,如此
withCallingHandlers({
for(i in 1:nrow(dat)){
w <- length(warnings())
dat$logk[i] <- log(dat$k[i])
}
}, warning = function(w){
dat$warnMsg[i] <<- w$message
invokeRestart("muffleWarning")
})
请注意,您需要警告处理程序中的<<-
运算符将消息分配给全局环境中的数据框,因为<-
将在dat
内创建{{1}}的本地副本。处理程序并在退出时将其丢弃。