【问题标题】:how to figure out which statement in lapply fails in R如何找出 lapply 中的哪个语句在 R 中失败
【发布时间】:2014-07-28 17:34:44
【问题描述】:

我经常有这样的情况:

result <- lapply(1:length(mylist), function(x){
doSomething(x)
})

但是,如果它失败了,我不知道列表中的哪个元素在 doSomething() 上失败了。

所以我最终将它重新编码为一个 for 循环:

for(i in 1: length(mylist)){
doSomething(mylist[[i]])
}

然后我可以看到i 的最后一个值以及发生了什么。必须有更好的方法来做到这一点?谢谢!

【问题讨论】:

  • 你试过运行traceback()吗?
  • 或者在你的函数中使用print(x)(非常慢)
  • @nrussell:traceback 向我显示了失败的代码行,但它通常不会向我显示进入该代码行的可读格式的输入。
  • @Floo0: print(x) 确实会减慢执行速度并打印出一大堆乱七八糟的东西——尽管这会在紧要关头完成。
  • 你能发布一个可重现的例子吗?我知道您正在寻找一个通用的解决方案,但是能够检查一个特定的实例并从那里进行概括会有所帮助。

标签: r list debugging for-loop


【解决方案1】:

注意错误如何包含5L

> lapply(1:10, function(i) if (i == 5) stop("oops"))
Error in FUN(1:10[[5L]], ...) : oops

表示第 5 次迭代失败。

【讨论】:

    【解决方案2】:

    一个简单的选择是运行代码:

    options( error=recover )
    

    在运行lapply 之前(详情请参阅?recover)。

    然后,当/如果发生错误时,您将立即进入恢复模式,让您检查您所在的函数、传递给该函数的参数等,这样您就可以看到您所处的步骤和错误的可能原因是什么。

    您还可以使用 cmets 中提到的 trytryCatch 来跳过产生错误的元素或打印出错误发生位置的信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-18
      • 1970-01-01
      • 1970-01-01
      • 2018-09-02
      • 2021-07-19
      相关资源
      最近更新 更多