Хобрук: Ваш путь к мастерству в программировании

R — tryCatch — использовать индекс последней итерации, чтобы перезапустить цикл for

Я уже прочитал документацию и несколько других вопросов о tryCatch(), однако я не могу найти решение проблемы моего класса.

Задача для решения: 1) Существует цикл for, который идет от строки 1 до nrow кадра данных. 2) Выполнить какую-либо инструкцию. 3) В случае ошибки, которая остановит программу, вместо этого перезапустите цикл цикла с текущей итерации.

Пример

for (i in 1:50000) {
...execute instructions...
}

То, что я ищу, - это решение, которое в случае ошибки на итерации 30250 перезапускает цикл, чтобы

for (i in 30250:50000) {
...execute instructions...
}

Практический пример, над которым я работаю, следующий:

library(RDSTK)
library(jsonlite)
DF <- (id = seq(1:400000), lat = rep(38.929840, 400000), long = rep( -77.062343, 400000)
for (i in 1 : nrow(DF) {
    location <- NULL
    bo <- 0
    while (bo != 10) {  #re-try the instruction max 10 times per row 
        location <- NULL
        location <- try(location <-  #try to gather the data from internet
                coordinates2politics(DF$lat[i], DF$long[i]))
        if (class(location) == "try-error") {  #if not able to gather the data
            Sys.sleep(runif(1,2,7))  #wait a random time before query again
            print("reconntecting...")
            bo <- bo+1                      
            print(bo)                 
        } else    #if there is NO error
            break   #stop trying on this individual
    }
    location <- lapply(location, jsonlite::fromJSON)
    location <- data.frame(location[[1]]$politics)
    DF$start_country[i] <- location$name[1]
    DF$start_region[i] <- location$name[2]
    Sys.sleep(runif(1,2,7))  #sleep random seconds before starting the new row
}

NB: try() является частью "... инструкции выполнения..."

Что я ищу, так это tryCatch, который, когда происходит критическая ошибка, останавливающая программу, вместо этого перезапускает цикл for с текущего индекса «i».

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

Надеюсь, мой вопрос понятен, большое спасибо.


  • В случае загрузки материалов из Интернета используйте RETRY() из пакета httr. 14.11.2017
  • это также хорошая идея для других типов проблем. Здесь проблема не в сборе данных из Интернета, а в том, как использовать tryCatch() (или некоторые другие функции) для перезапуска цикла с предыдущей итерации в случае ошибки. 14.11.2017

Ответы:


1

Это лучше решать с помощью while, а не for:

i <- 1
while(i < 10000){
  tryCatch(doStuff()) -> doStuffResults
  if(class(doStuffResults) != "try-catch") i <- i + 1
{

Однако будьте осторожны, если в некоторых случаях всегда будет сбой doStuff: цикл никогда не завершится!

Если программа выдаст фатальную ошибку и потребует ручного перезапуска, то первая строка i <- 1 может быть заменена (если вы не используете i где-либо еще в своем коде) на

if(!exists("i")) i <- 1

чтобы значение из цикла сохранялось и не сбрасывалось на единицу.

14.11.2017
  • Я разместил код реального примера, чтобы вы могли поработать над ним и представить полный ответ. Не могли бы вы применить свою методологию к конкретной проблеме? Однако будьте осторожны, чтобы try() был компонентом doStuff. Например, если программе не удастся получить данные строки i из Интернета 10 раз, программа выдаст ошибку. В этот момент программа сломается, и я должен перезапустить ее вручную, НО... tryCatch позволяет перезапустить цикл while с этого отдельного i. 14.11.2017
  • Я разместил код реального примера, чтобы вы могли поработать над ним и представить полный ответ. - Золото! Как насчет того, чтобы попробовать сделать это самому? 14.11.2017
  • Конечно, я тоже пытаюсь сделать это сам. Я просто предложил вам, чтобы вы могли дать золотой ответ на этот вопрос, а не просто намек. :) Все равно спасибо 14.11.2017
  • @Enrico: я пытаюсь дать общий ответ, а не ответ на очень конкретную задачу, как вы представили. Я добавил пояснение, учитывая, что ваша программа может завершиться, и вы хотите возобновить ее с тем же значением i. Также обратите внимание, что doStuff() на самом деле не обязательно должна быть функцией: вы можете вставить тело цикла for вместо него в виде набора выражений в фигурных скобках, и это также сработает. 14.11.2017
  • @JDL Я не могу заставить работать ваш подход, потому что Ошибка: лексическая ошибка: недопустимый символ в тексте json. все равно сломаю программу. Есть идеи? 14.11.2017
  • Если есть определенные ошибки, которые не исчезнут после нескольких повторных попыток, вы можете изменить приведенный выше пример, чтобы увеличить i и вызвать next. Это будет зависеть от ваших конкретных процедур. Если у вас есть отдельная проблема с какой-то другой частью вашего кода, я предлагаю вам задать отдельный вопрос (например, почему я получаю недопустимые строки JSON в том-то и том-то?) 15.11.2017
  • Новые материалы

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

    Внедрите OAuth в свои веб-приложения для повышения безопасности
    OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

    Как свинг-трейдеры могут использовать ИИ для больших выигрышей
    По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

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

    Обзор: Машинное обучение: классификация
    Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

    Разработка расширений Qlik Sense с qExt
    Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..