Я уже прочитал документацию и несколько других вопросов о 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 строк и перезапускаться там, где она была прервана в случае ошибок. Это означает, что программа сможет работать полностью независимо от человека.
Надеюсь, мой вопрос понятен, большое спасибо.
i
. Также обратите внимание, чтоdoStuff()
на самом деле не обязательно должна быть функцией: вы можете вставить тело цикла for вместо него в виде набора выражений в фигурных скобках, и это также сработает. 14.11.2017i
и вызватьnext
. Это будет зависеть от ваших конкретных процедур. Если у вас есть отдельная проблема с какой-то другой частью вашего кода, я предлагаю вам задать отдельный вопрос (например, почему я получаю недопустимые строки JSON в том-то и том-то?) 15.11.2017