Я думаю, что лучше всего было бы выяснить, почему ваша программа зависла, и устранить причину.
Если вы обнаружите, что причина «зависания» находится вне вашего контроля, ошибки - ваш друг. Если вы можете обнаружить условия, которые приводят к проблеме, выведите ошибку, используяstop()
.
Это может быть использовано в другом месте вашей программы с помощью tryCatch
.Я также обнаружил, что функция безопасно пакета purrr
неоценима для подобных ситуаций, потому что вы можете обработать длинный список подверженных ошибкам файлов и решить, как потом элегантно обрабатывать ошибки.Я нахожу, что это часто приводит к более аккуратному коду, чем tryCatch
.
Некоторые другие стратегии, которые следует учитывать:
Интерактивная отладка
Если есть способ определить, что программа зависла программно, и вы не хотитеЧтобы переработать код для обработки ошибок, вы можете запустить интерактивный отладчик с вызовом browser()
, например,
if (stuck) {
browser()
}
Затем вы можете взаимодействовать со средой и вручную возобновлять выполнение.
Сохранение прогресса
Звучит так, как будто функция обрабатывает предметы и, возможно, производит вывод.Если вы можете записывать результаты своих вычислений по ходу дела, либо в файл, либо в какое-либо место в памяти, вы можете добавить в код условие, пропускающее уже обработанные элементы.
ДляНапример, используя file.exists()
и saveRDS()
что-то вроде:
process_item <- function(item) {
... # some steps to produce a result
# Then write the result to disk, using the hash of the input as the file name
saveRDS(result, paste0(digest::digest(item), ".rds")
result
}
for (i in seq_along(items)) {
# skip items that have already been processed
if (file.exists(digest::digest(items[[i]])) next
process_item(items[[i]])
}
Таким образом, когда вы снова запустите программу после ее зависания, вы не будете тратить время на повторную обработку элементов.