2014-09-11 11 views
5

Napisałem skrypt R, który zapisuje komunikaty (raport postępu) do pliku tekstowego. I zmodyfikowano opcję error tak, że gdy wystąpi błąd, pojawi się komunikat o błędzie jest również zapisane w tym pliku:Zatrzymywanie skryptu R bez uzyskania komunikatu "Błąd podczas pakowania"

options(error = function() { 
cat(geterrmessage(),file = normalizePath("logs/messages.txt"),append = TRUE) 
stop() 
}) 

to działa, ale pojawia się ten komunikat w konsoli/oknie terminala, gdy nie występuje błąd:

Error during wrapup: 
Execution halted 

Więc myślę, że jest lepszy sposób na przerwanie wykonywania skryptu ... czy jest tam?

+0

Podejrzewam, że musisz usunąć 'stop()' z tego. – Andrie

+0

Co się stanie, jeśli uruchomię skrypt z Rscript.exe myscript.R, zgłoszony zostanie błąd, ale skrypt działa bez zatrzymywania. –

+0

Spróbuj użyć q() zamiast stop(). Obsługa błędów zostaje wywołana za pomocą funkcji stop(), więc zatrzymanie się z poziomu zatrzymania ... brzmi jak rekursja. To * może * być, co jest nie tak. –

Odpowiedz

5

Właśnie znalazłem to wewnątrz kodu źródłowego R:

if (inError) { 
    /* fail-safe handler for recursive errors */ 
    if(inError == 3) { 
     /* Can REprintf generate an error? If so we should guard for it */ 
     REprintf(_("Error during wrapup: ")); 
     /* this does NOT try to print the call since that could 
      cause a cascade of error calls */ 
     Rvsnprintf(errbuf, sizeof(errbuf), format, ap); 
     REprintf("%s\n", errbuf); 
    } 

stop() przyczynia się do wykonywanego programu obsługi błędu. Jeśli wywołanie stop() wystąpi w ramach procedury obsługi błędów, R wyświetli komunikat Error during wrapup: i uniemożliwi nieskończoną rekursję, która wystąpiłaby inaczej.

Nie dzwoń pod numer stop() od wewnątrz urządzenia options$error.

Zamiast tego należy użyć q(save="no", status=1, runLast=FALSE), który powinien zrobić dokładnie to, co robi domyślny moduł obsługi błędów w przypadku nieinteraktywnego użycia. Aby uzyskać szczegółowe informacje na temat obsługi błędów, patrz: ?options w celu uzyskania informacji na temat options$error i ?stop.

Powiązane problemy