Ich verwende getYahooData()
function im TTR Paket ziemlich intensiv.
Ich habe dieses Stück Code:
%Vor%Diese Schleife ist lang Ich erhalte diesen Fehler:
Fehler in Datei (Datei, "rt"): alle Verbindungen sind in Verwendung Anrufe: tryCatch ... doTryCatch - & gt; getYahooData - & gt; getYahooData - & gt; read.table - & gt; Datei Die Ausführung wurde angehalten.
Was kann ich tun?
UPDATE:
Wenn ich closeAllConnections () verwende, bekomme ich:
%Vor% Erstens: Benutze niemals in deinem Leben dieses Konstrukt weiter. Es nützt nichts. tryCatch()
wird fortgesetzt, wenn Sie einen Handler für einen Fehler oder eine Warnung definiert haben. Es wird dieses anstelle des "Standard" error=function(e) stop(e)
verwendet. Dieser wird deine Funktion stoppen. Wenn Sie einen Handler definieren (entweder warning=
oder error=
), wird Ihr Skript nicht gestoppt, sodass continue nicht erforderlich ist.
Das sagte: Die korrekte Verwendung von tryCatch wäre in diesem Fall:
%Vor%oder, wenn Sie es in einem Skript verwenden und bei Auftreten eines Fehlers zur nächsten Schleife wechseln möchten, können Sie einfach Folgendes verwenden:
%Vor%Wenn Sie diese Art von tryCatch verwendet oder versucht hätten, hätten Sie die Probleme, die Sie hier melden, nicht gehabt.
Jetzt könnte ich deinen Fall reproduzieren, wenn ich nicht existierende Symbole verwende. Ihre fehlerhafte Verwendung der tryCatch()
-Funktion verursacht Probleme. read.table
gibt einen Fehler zurück ( Error in file(file, "rt") : cannot open the connection
). Dies ist ein Fehler , keine Warnung. Sie erhalten eine zusätzliche Warnung, die besagt, dass eine nicht gefundene 404-Datei zurückgegeben wurde.
Wenn eine Warnung zusammen mit einem Fehler ausgegeben wird, wird zuerst die Handlerfunktion für die Warnung bearbeitet. Das liegt daran, dass eine Warnung ausgegeben werden muss, bevor die Funktion gestoppt werden kann. Es wird also nicht mit dem Fehler umgehen, den Sie erhalten, was bedeutet, dass der Da der Fehler nicht behoben wird, läuft bei der Registrierung von die Verbindungen. Da die Verbindung nicht geöffnet werden konnte, hat on.exit(close(file))
in read.table()
nicht aufgerufen wird. Daher wird die Verbindung nicht korrekt geschlossen und trotzdem als offen betrachtet, obwohl sie von R nicht mehr gefunden werden kann (showAllConnections () zeigt nichts an). on.exit(close(...))
keine Auswirkung. showConnections()
zeigt die Verbindung nicht an, aber R denkt immer noch, dass sie da ist. Daher bricht die Hölle los und du stürzt deinen R ab.
Danke für die Korrekturen an @Tommy
Ein einfaches Codebeispiel zur Veranschaulichung:
%Vor%Zusammenfassend:
Und als Extra: Ihre Schleife gibt nur das Ergebnis des letzten Aufrufs zurück, da Sie prices
bei jedem Durchlauf der Schleife überschreiben, falls Sie die richtigen Symbole verwendet hätten.
Bearbeiten: falls Sie die Aktion fortsetzen möchten
Dies ist tatsächlich ein Fehler im R-Quellcode, der angibt, wie Verbindungen registriert sind. Ich habe einige Kommentare und einen Patch auf der R Bugzilla-Seite hier gepostet: Ссылка . Joris 'Empfehlungen sind solide. CloseAllConnections () funktioniert jedoch auch, wenn der Fehler behoben ist. (P.S. Dies ist mein erster StackOverflow Beitrag. Entschuldigen Sie, wenn ich die Etikette verletzt habe.)
Irgendwo in meiner letzten Grabung erwähnte jemand, dass die Verwendung einer URL-Referenz in einer Funktion wie read.table.url () oder url () einen etwas fehlerhaften nativen R-HTTP-Connector aufgerufen hat. Was beim Schließen von Verbindungen im Fehlerfall besser funktioniert hat, ist das explizite Aufrufen von RCurl innerhalb eines read.table () - oder äquivalenten Funktionsaufrufs. Zum Beispiel gab mir das Probleme, wenn viele HTTP-Fehler angehäuft wurden:
%Vor%Ich habe gute Ergebnisse mit der RCurl-Variante gesehen und die getURL-Funktion aufgerufen:
%Vor%Dies ist während der Ausführung von R v2.15.3.
Tags und Links r error-handling try-catch