【问题标题】:R loop: How can I determine the iteration that caused warnings?R循环:如何确定导致警告的迭代?
【发布时间】:2014-11-10 01:45:46
【问题描述】:

我正在运行一项模拟研究,需要为导致 R 打印警告消息的每次模拟运行创建一个指示变量。由于我模拟了数据,有时我试图拟合的模型可能不会收敛。因此,我需要使用指标变量存储未收敛的迭代。我使用了“options(warn=1)”,所以我可以在控制台上看到模型失败的迭代。但是我的代码没有正确保存指标。我总共需要运行 100 次模拟。

这是我的代码的简化版本:

for (s in 1:100){

    myfit=...
    if (!is.null(warnings())) {fail[s]=1} else {fail[s]=0}
}

非常感谢任何建议!

谢谢, 莉莉

【问题讨论】:

  • “未正确保存指标”是什么意思?你在循环之前初始化了fail <- numeric(100) 吗?另外我建议在这里明确使用tryCatch
  • 是的,我初始化失败。当我运行代码时,所有的失败值都是 0,即使我知道几次迭代没有收敛。我还使用了“try()”函数,但对于所有迭代仍然失败=0。 myfit=try(...) if (is(myfit,"try-error")) {fail[s]=1} else {fail[s]=0}
  • 那是因为您正在捕获警告,而不是错误。
  • 你是对的!不知道我是怎么错过这么明显的东西的。

标签: r


【解决方案1】:

使用tryCatch

这是一个模仿你想要的行为的最小示例:

silly_list <- vector("list", 26)
fail <- numeric(26)
for(s in 1:26) {
    l <- letters[s]
    tryCatch(silly_list[[s]] <- factor(1:3, levels = c("a", l, "b")),
             warning = function(w) {
                 print(w)
                 fail[s] <<- 1
             })
}
## <simpleWarning in `levels<-`(`*tmp*`, value = if (nl == nL) as.character(labels) else paste0(labels, seq_along(levels))): duplicated levels in factors are deprecated>
## <simpleWarning in `levels<-`(`*tmp*`, value = if (nl == nL) as.character(labels) else paste0(labels, seq_along(levels))): duplicated levels in factors are deprecated>
print(fail)
## [1] 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

而且没有必要更改options("warn")

【讨论】:

  • 谢谢 ssdecontrol!我在玩 tryCatch,你的例子很有帮助。我想我得到了它的工作。
  • @Lili R 的错误处理文档令人发指。
猜你喜欢
  • 2021-04-26
  • 2017-05-02
  • 1970-01-01
  • 1970-01-01
  • 2021-01-08
  • 2010-10-30
  • 1970-01-01
  • 1970-01-01
  • 2018-09-30
相关资源
最近更新 更多