Все соединения используются: выполнение остановлено - PullRequest
8 голосов
/ 18 августа 2011

Я использую функцию getYahooData() в пакете TTR довольно интенсивно.

У меня есть этот кусок кода:

for(i in 1:nrow(symbol)){
    tryCatch(prices <- getYahooData(symbol$symbol[i], from, to, freq="daily", 
                                    type="price"), 
             warning=function(e) continue <- 0)
    if (continue==0) next
}

Этот цикл длинный Я получаю эту ошибку:

Ошибка в файле (file, "rt"): все соединения используются. Вызовы: tryCatch ... doTryCatch -> getYahooData -> getYahooData -> read.table -> file Исполнение остановлено

Что я могу сделать?

UPDATE:

Если я использую closeAllConnections (), я получаю:

 I get: *** caught segfault *** address (nil), cause 'memory not mapped' Traceback: 1: getConnection(set[i]) 2: close(getConnection(set[i])) 3: closeAllConnections() aborting ... 

Ответы [ 4 ]

15 голосов
/ 18 августа 2011

Во-первых: никогда в жизни не используйте те, которые продолжают конструировать снова.Это бесполезно.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 каждый раз, когда проходите цикл, если бы вы использовали правильные символы.

Редактировать: если вы хотите продолжить действие

10 голосов
/ 18 августа 2011

Закрыть некоторые соединения?Может быть так же просто, как вставить closeAllConnections() в конце этого тела цикла.

8 голосов
/ 23 августа 2011

Это действительно ошибка в исходном коде R, касающаяся того, как регистрируются соединения.Я разместил некоторые комментарии и патч на сайте R Bugzilla здесь: http://bugs.r -project.org / bugzilla3 / show_bug.cgi? Id = 14660 .Рекомендации Joris являются обоснованными.Однако closeAllConnections () также будет работать, когда ошибка будет исправлена.(PS Это мой первый пост в StackOverflow. Извините, если я нарушил этикет.)

0 голосов
/ 09 октября 2014

Где-то в моем прошлом копании кто-то упоминал, что использование ссылки URL в функции, такой как read.table.url () или url (), вызвало несколько ошибочный нативный R-коннектор HTTP.Что оказалось лучше для закрытия соединений при ошибке, так это явный вызов RCurl внутри read.table () или эквивалентного вызова функции.Например, это доставляло мне проблемы, когда накапливалось много ошибок HTTP:

result <- try ( DF <- read.table(con <- url(url), col.names=colNames),
silent=TRUE )

Я видел хорошие результаты при использовании варианта RCurl, вызывая его функцию getURL:

result <- try ( DF <- read.table(textConnection(getURL(url)), col.names=colNames),
silent=TRUE )

Это во время работы R v2.15.3.

...