如何将警告消息保存在循环内的向量或数据框中,以便它们可以与特定迭代相关联?
这是一个玩具示例,我想将操作 ( 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()操作,但对我来说还不是很明显。
你可以用这个函数完成你想要的事情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