Этот вопрос может или не может быть вдохновлен моей потерей всего трехчасового пробега геокодирования, потому что одно из значений возвращает ошибку. Вызовите жалкие (вниз) голоса.
В основном была ошибка, возвращаемая внутри функции, называемой sapply
. У меня был options(error=recover)
, но, несмотря на просмотр всех доступных мне уровней, я не мог найти места, где результаты (тысячи успешных) вызовов FUN были сохранены в памяти.
Некоторые из объектов, которые я обнаружил при просмотре самих себя, дали ошибки, когда я попытался их исследовать, утверждая, что ссылки больше недействительны. К сожалению, я потерял конкретное сообщение об ошибке.
Вот быстрый пример, который, хотя он не реплицирует ссылочную ошибку (которая, как я подозреваю, связана с исчезающими средами и, вероятно, несущественна), демонстрирует, что я не вижу способа сохранить данные, которые уже были обработаны.
Есть ли такая методика?
Обратите внимание, что с тех пор я реализовал свою ошибку и вставил еще более надежную обработку ошибок, чем раньше, чем через try
, но я ищу способ восстановить содержимое ex post, а не ex ante.
Функция тестирования
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
.