这个问题可能会或可能不会受到我失去整个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失败时得到.
您从未将中间值分配给任何东西。我不明白为什么你认为应该有占卜的内脏。您需要以某种方式记录这些值:
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).