この質問は、値の 1 つがエラーを返したために、3 時間のジオコーディング実行全体を失ったことに触発された可能性があります。残念な(マイナス)票をキューに入れます。
基本的に、 によって呼び出された関数内でエラーが返されましたsapply
。私はそうoptions(error=recover)
しましたが、利用可能なすべてのレベルを閲覧したにもかかわらず、FUN への (何千もの成功した) 呼び出しの結果がメモリに保存されている場所を見つけることができませんでした。
自分自身をブラウズしているときに見つけたオブジェクトのいくつかを調べようとすると、参照が無効になったと主張してエラーが発生しました。残念ながら、特定のエラー メッセージを失いました。
これは、参照エラー (環境の消失に関連していると思われ、おそらく重要ではない) を再現していませんが、既に処理されたデータを保存する方法が見つからないことを示す簡単な例です。
そのようなテクニックはありますか?
それ以来、私は自分のエラーに気づき、 を介して以前よりもさらに堅牢なエラー処理を挿入しましたが、事前ではなく事後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
失敗したときに取得したい。