Могут ли существующие результаты быть возвращены при остановке вручную в R - PullRequest
0 голосов
/ 20 декабря 2018

Я использую функцию для обработки некоторых данных из 9000 предметов.Иногда программа застревает там после того, как она закончила, например, 6000 пунктов.

В этом случае мне придется вручную остановить программу, используя маленькую красную кнопку в RStudio, и перезапустить запуск с нуля..

Мне было интересно, если есть некоторые способы, даже если я остановлю программу вручную, она все равно сможет вернуть существующие результаты, чтобы мне не пришлось перезапускать с нуля.

Может быть что-то вроде tryCatch, но так как остановка вручную на самом деле не является ошибкой, я понятия не имею, как это сделать с tryCatch

Спасибо

1 Ответ

0 голосов
/ 21 декабря 2018

Я думаю, что лучше всего было бы выяснить, почему ваша программа зависла, и устранить причину.

Если вы обнаружите, что причина «зависания» находится вне вашего контроля, ошибки - ваш друг. Если вы можете обнаружить условия, которые приводят к проблеме, выведите ошибку, используя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]])
}

Таким образом, когда вы снова запустите программу после ее зависания, вы не будете тратить время на повторную обработку элементов.

...