R中值[[3L]](cond)的误差是多少?

时间:2015-08-06 11:15:56

标签: r error-handling try-catch

由于内存不足,我的代码有错误。实际上我在大数据上做了一个线性模型(lm)。问题不是因为它给了我错误,我想记录,但因为它包含#define GREEN_COLOR 0x69BC63 #define RED_COLOR 0xCC4C46 #define UIColorFromRGB(rgbValue) [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 green:((float)((rgbValue & 0xFF00) >> 8))/255.0 blue:((float)(rgbValue & 0xFF))/255.0 alpha:1.0] //Working [amount setTextColor: [[trans amount] intValue]>=0 ? UIColorFromRGB(GREEN_COLOR):UIColorFromRGB(RED_COLOR)]; //Not working [amount setTextColor: UIColorFromRGB([[trans amount] intValue]>=0 ? GREEN_COLOR:RED_COLOR)];

我的错误如下:

value[[3L]](cond)

记录它的代码看起来像这样(使用logging lib):

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):吗?

1 个答案:

答案 0 :(得分:6)

您在内部stop()发出tryCatch,在内部,当出现错误情况时,tryCatch()会调用您提供的错误处理程序,这是列表中的第三个元素(内部tryCatch)。它通过:cond调用该处理程序传递条件value[[3L]](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)
  })