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

Chr*_*ook 5 warnings loops r

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

这是一个玩具示例,我想将操作 ( 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())]
  }
}
Run Code Online (Sandbox Code Playgroud)

这似乎不起作用,因为warnings()在循环结束之前,循环内生成的任何警告都不可用于调用。我是否需要指定不同的环境来访问循环内的新警告?

我怀疑还有一种更好的方法可以完全使用try()or来完成此tryCatch()操作,但对我来说还不是很明显。

Bac*_*lin 7

你可以用这个函数完成你想要的事情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")
})
Run Code Online (Sandbox Code Playgroud)

请注意,您需要<<-警告处理程序中的运算符将消息分配给全局环境中的数据帧,因为会在处理程序中<-创建一个本地副本并在退出时丢弃它。dat