将循环中的警告消息保存到矢量或数据框

时间:2014-02-24 15:19:22

标签: r loops warnings

如何将警告消息保存在循环内的向量或数据框中,以便它们可以与特定的迭代相关联?

这是一个玩具示例,我想在数据框(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()完全执行此操作还有更好的方法,但对我来说这一点并不明显。

1 个答案:

答案 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}}的本地副本。处理程序并在退出时将其丢弃。