R中数值[[3L]](秒)的误差是多少



我有一个代码由于内存不足而出错。实际上,我对一个大数据做了一个线性模型。问题不是因为它给了我想要记录的错误,而是因为它包含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>吗?

您在内部tryCatch中发出stop(),在内部,当出现错误条件时,tryCatch()会调用您提供的错误处理程序,该错误处理程序是列表中的第三个元素(tryCatch内部(。它通过:value[[3L]](cond)调用传递条件cond的处理程序。由于错误处理程序调用了stop,所以最近的错误就是在这里调用的。

您可以使用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)
  })

最新更新