在大的'sapply`中从错误中解脱出来

Ari*_*man 11 error-handling r

这个问题可能会或可能不会受到我失去整个3小时地理编码运行的启发,因为其中一个值返回了错误.提示怜悯(下)投票.

基本上在被调用的函数内返回了一个错误sapply.我曾经options(error=recover),但尽管浏览了我可以使用的每个级别,我找不到任何将(数千次成功)调用FUN的结果存储在内存中的地方.

我在浏览周围时发现的一些对象在我尝试检查它们时会出错,声称引用不再有效.不幸的是我丢失了特定的错误消息.

这是一个快速的例子,虽然它没有复制引用错误(我怀疑它与消失的环境有关并且可能并不重要),但它确实证明我看不到保存已处理数据的方法.

有这样的技术吗?

请注意,我已经意识到我的错误并插入了比之前存在的更强大的错误处理try,但我正在寻找一种方法来事后恢复内容而不是事前.

测试功能

sapply( seq(10), function(x) {
  if(x==5) stop("Error!")
  return( "important data" )
} )
Run Code Online (Sandbox Code Playgroud)

互动探索

> sapply( seq(10), function(x) {
+   if(x==5) stop("Error!")
+   return( "important data" )
+ } )
Error in FUN(1:10[[5L]], ...) : Error!

Enter a frame number, or 0 to exit   

1: sapply(seq(10), function(x) {
    if (x == 5) 
        stop("Error!")
    return("important data")
})
2: lapply(X = X, FUN = FUN, ...)
3: FUN(1:10[[5]], ...)

Selection: 3
Called from: FUN(1:10[[5L]], ...)
Browse[1]> ls()
[1] "x"
Browse[1]> x
[1] 5
Browse[1]> 
Enter a frame number, or 0 to exit   

1: sapply(seq(10), function(x) {
    if (x == 5) 
        stop("Error!")
    return("important data")
})
2: lapply(X = X, FUN = FUN, ...)
3: FUN(1:10[[5]], ...)

Selection: 2
Called from: lapply(X = X, FUN = FUN, ...)
Browse[1]> ls()
[1] "FUN" "X"  
Browse[1]> X
 [1]  1  2  3  4  5  6  7  8  9 10
Browse[1]> FUN
function(x) {
  if(x==5) stop("Error!")
  return( "important data" )
}
Browse[1]> 
Enter a frame number, or 0 to exit   

1: sapply(seq(10), function(x) {
    if (x == 5) 
        stop("Error!")
    return("important data")
})
2: lapply(X = X, FUN = FUN, ...)
3: FUN(1:10[[5]], ...)

Selection: 1
Called from: sapply(seq(10), function(x) {
    if (x == 5) 
        stop("Error!")
    return("important data")
})
Browse[1]> ls()
[1] "FUN"       "simplify"  "USE.NAMES" "X"        
Browse[1]> X
 [1]  1  2  3  4  5  6  7  8  9 10
Browse[1]> USE.NAMES
[1] TRUE
Browse[1]> simplify
[1] TRUE
Browse[1]> FUN
function(x) {
  if(x==5) stop("Error!")
  return( "important data" )
}
Browser[1]> Q
Run Code Online (Sandbox Code Playgroud)

要清楚,我希望找到的是矢量:

[1] "important data" "important data" "important data" "important data"
Run Code Online (Sandbox Code Playgroud)

换句话说,内部循环的结果已经完成到这一点.

编辑:使用C代码更新

里面.Internal(lapply())以下代码:

PROTECT(ans = allocVector(VECSXP, n));
...
for(i = 0; i < n; i++) {
   ...
   tmp = eval(R_fcall, rho);
   ...
   SET_VECTOR_ELT(ans, i, tmp);
}
Run Code Online (Sandbox Code Playgroud)

我想在ans任何来电lapply失败时得到.

42-*_*42- 1

您从未将中间值分配给任何东西。我不明白为什么你认为应该有占卜的内脏。您需要以某种方式记录这些值:

 res <- sapply( seq(10), function(x) { z <- x
                                   on.exit(res <<- x);
                                   if(x==5) stop("Error!")
 } )
Error in FUN(1:10[[5L]], ...) : Error!
 res
#[1] 5
Run Code Online (Sandbox Code Playgroud)

on.exit页面上说明了此方法?par,作为绘图出错时恢复标准设置的一种方法。(我无法让它与on.exit(res <- x).

  • 如果“sapply”(实际上是“sapply”内部调用的“lapply”)没有存储它,那么在没有错误的情况下它是如何神奇地出现的?它可能不会存储在 R 代码中,但在“lapply”的“.Internal”版本中的某个位置,有一个向量与我的结果一起存储,天哪:-) (2认同)