这个问题可能会或可能不会受到我失去整个 3 小时地理编码运行的启发,因为其中一个值返回了错误。提示遗憾(向下)投票。
基本上在由sapply
. 我继续了options(error=recover)
,但尽管浏览了我可用的每个级别,但我找不到任何地方将(数千次成功)调用 FUN 的结果存储在内存中。
我在浏览时发现的一些对象在我尝试检查它们时出错,声称这些引用不再有效。不幸的是,我丢失了特定的错误消息。
这是一个简单的示例,虽然它没有复制参考错误(我怀疑这与消失的环境有关并且可能无关紧要),但确实表明我看不到保存已处理数据的方法。
有这样的技术吗?
请注意,我已经意识到我的错误并插入了比以前更强大的错误处理 via try
,但我正在寻找一种事后而不是事前恢复内容的方法。
测试功能
sapply( seq(10), function(x) {
if(x==5) stop("Error!")
return( "important data" )
} )
互动探索
> 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
需要明确的是,我希望找到的是向量:
[1] "important data" "important data" "important data" "important data"
也就是说,到此为止已经完成的内部循环的结果。
编辑:使用 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);
}
ans
当任何呼叫lapply
失败时,我想知道。