Alle Verbindungen werden verwendet: Ausführung angehalten

7

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%     
Dail 18.08.2011, 06:47
quelle

4 Antworten

13

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 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). 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(...)) 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:

  • überprüfe die verwendeten Symbole. Sie sind wahrscheinlich falsch.
  • Verwenden Sie nie wieder einen Warnungs-Handler, wenn Sie Fehler erwarten.

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

    
Joris Meys 18.08.2011, 14:12
quelle
9

Schließen Sie einige Verbindungen? Könnte so einfach sein wie closeAllConnections() am Ende dieses Schleifenkörpers einzufügen.

    
42- 18.08.2011 06:56
quelle
8

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.)

    
Matt Shotwell 23.08.2011 16:59
quelle
0

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.

    
Robert Casey 09.10.2014 19:54
quelle

Tags und Links