Во-первых: никогда в жизни не используйте те, которые продолжают конструировать снова.Это бесполезно.tryCatch()
будет продолжаться, если вы определили обработчик для ошибки или предупреждения.Он будет использовать этот вместо «по умолчанию» error=function(e) stop(e)
.Этот остановит вашу функцию.Если вы определите обработчик (либо warning=
, либо error=
), ваш сценарий не будет остановлен, поэтому продолжить не нужно.
Это говорит: правильное использование tryCatch в этом случае будет:
for(i in 1:nrow(symbol)){
tryCatch(prices <- getYahooData(symbol$symbol[i], from, to, freq="daily",
type="price"), error = function(e){})
}
или, если вы используете его в скрипте и хотите перейти к следующему циклу при возникновении ошибки, вы можете просто использовать:
for(i in 1:nrow(symbol)){
prices <- try(getYahooData(symbol$symbol[i], from, to, freq="daily",
type="price"), silent=TRUE)
if(inherits(prices,"try-error")) { next } # only true if an error occurs
... # rest of calculations
}
Если бы вы использовали этот способ tryCatch или try, у вас не было бы проблем, о которых вы сообщаете здесь.
Теперь я мог бы воспроизвести ваш случай, если бы я использовал несуществующие символы.Ваше ошибочное использование функции tryCatch()
доставляет вам неприятности.read.table
возвращает ошибку (Error in file(file, "rt") : cannot open the connection
).Это ошибка , а не предупреждение.Вы получаете дополнительное предупреждение о том, что файл 404 не найден, был возвращен.
Когда выдается предупреждение вместе с ошибкой, сначала обрабатывается функция обработчика для предупреждения.Это связано с тем, что перед остановкой функции должно быть выдано предупреждение.Таким образом, она не обработает полученную ошибку , что означает, что on.exit(close(file))
в read.table()
не будет вызвано.Следовательно, соединение не закрывается правильно и все еще считается открытым, хотя R его больше не может найти (showAllConnections () ничего не показывает). Поскольку ошибка не устранена, что-то идет не так при регистрациисоединения.Поскольку соединение не может быть открыто, on.exit(close(...))
не будет иметь никакого эффекта.showConnections()
не показывает соединение, но почему-то R все еще думает, что оно там.Следовательно, весь ад проваливается, и вы разбиваете свою R.
спасибо за исправления к @ Tommy
Простой пример кода, чтобы проиллюстрировать это:
myfun <- function(x){
if(x>1) warning("aWarning")
stop("aStop")
x
}
tryCatch(myfun(0.5),
warning=function(w)print("warning"),
error=function(e) print("stop"))
[1] "stop"
tryCatch(myfun(1.5),
warning=function(w)print("warning"),
error=function(e) print("stop"))
[1] "warning"
В итоге:
- проверьте символы, которые вы используете.Вероятно, они ошибаются.
- никогда больше не используйте обработчик предупреждений, если вы ожидаете ошибки.
И, как дополнительная опция: ваш цикл будет возвращать только результат последнего вызова, так как вы перезаписываете prices
каждый раз, когда проходите цикл, если бы вы использовали правильные символы.
Редактировать: если вы хотите продолжить действие