【问题标题】:What is Error in value[[3L]](cond) in R?R中值[[3L]](cond)的错误是什么?
【发布时间】:2015-10-29 12:22:38
【问题描述】:

我的代码由于内存不足而出错。实际上我在大数据上做了一个线性模型(lm)。问题不是因为它给了我想要记录的错误,而是因为它包含value[[3L]](cond)

我的错误如下所示:

Error in value[[3L]](cond): While training model Error: cannot allocate vector of size 6.4 Gb

记录它的代码如下所示(使用日志库):

tryCatch({
  # some code
  tryCatch({
    # some other code
  }, warning = function(war){
    logwarn(war, logger = "MyLogger")
  }, error = function(err){
    stop(paste("While training model", err, sep = " "))
  })
  some more code
}, error = function(err){
  logerror(err, logger = "MyLogger")
})

我的问题是为什么它说Error in value[[3L]](cond):?我做错了什么我不知道吗?不应该只是Error: <error message>吗?

【问题讨论】:

  • 什么?为什么是-1?我是 R 新手,所以如果我练习不好,请告诉我。或者,如果它总是在任何错误之前显示,那么告诉我,我在 google 上没有发现什么大问题(除非出现错误/警告,它已经出现在进行下一次迭代的问题中)

标签: r error-handling try-catch


【解决方案1】:

您在内部tryCatch 中发出stop(),并且在内部,当出现错误条件时,tryCatch() 调用您提供的错误处理程序,它是列表中的第三个元素(tryCatch 内部) .它通过value[[3L]](cond) 调用该处理程序传递条件cond。由于您的错误处理程序调用停止,这就是最近的错误被调用的地方。

您可以使用traceback()(隐式调用print())在错误处理程序中查看调用堆栈,如下所示:

tryCatch({
    stop('')
},error=function(err){
    traceback()
})

产生:

5: print(where) at #4
4: value[[3L]](cond)
3: tryCatchOne(expr, names, parentenv, handlers[[1L]])
2: tryCatchList(expr, classes, parentenv, handlers)
1: tryCatch({
       stop()
   }, error = function(err) {
       print(where)
   })

如果您想保留原始错误中的调用堆栈,但有更多信息性错误消息,只需编辑错误并重新引发它:

  tryCatch({
    # some other code
  }, warning = function(war){
    logwarn(war, logger = "MyLogger")
  }, error = function(err){
    # edit the error message
    err$message <- paste("While training model", err, sep = " ")
    # and re-raise
    stop(err)
  })

【讨论】:

    猜你喜欢
    • 2020-08-17
    • 2021-04-22
    • 2016-03-19
    • 2019-12-30
    • 1970-01-01
    • 2018-07-12
    • 2016-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多