2013-01-22 10 views
16

Czy istnieje sposób zatrzymania programu R bez błędu?Zatrzymaj program R bez błędu

Na przykład mam duże źródło, definiujące kilka funkcji, a po nim niektóre wywołania funkcji. Zdarza się, że edytuję niektóre funkcje i chcę, aby definicje funkcji były aktualizowane w środowisku R, ale tak naprawdę nie są wywoływane.

Zdefiniowałem zmienną justUpdate i kiedy jest TRUE chcę zatrzymać program zaraz po definicjach funkcji.

ReadInput <- function(...) ... 
Analyze <- function(...) ... 
WriteOutput <- function(...) ... 

if (justUpdate) 
    stop() 
# main body 
x <- ReadInput() 
y <- Analyze(x) 
WriteOutput(y) 

nazwałem stop() funkcję, ale problemem jest to, że wyświetla się komunikat o błędzie.

ctrl + c ma innej opcji, ale chcę, aby zatrzymać źródło w określonej linii.

Problem z q() lub quit() polega na tym, że kończy sesję R, ale chciałbym, aby sesja R była nadal otwarta.

Jak @JoshuaUlrich proponowane browser() może być innej opcji, ale nadal nie jest idealna, ponieważ źródło kończy się w nowym otoczeniu (czyli szybka R zmieni się Browser[1]> zamiast >). Nadal możemy nacisnąć Q, aby go zamknąć, ale szukam prostego sposobu.

Inną opcją jest użycie if (! justUpdate) { main body }, ale to usuwa problem, a nie go rozwiązuje.

Czy jest jakaś lepsza opcja?

+0

Czy możesz wyjaśnić, co próbujesz zrobić i dlaczego? To może nam pomóc. –

+0

@joran Nie chcę wyłączać wszystkich komunikatów o błędach – Ali

+4

Albo 1) umieść definicje funkcji w osobnym pliku (lub lepiej, pakiet) ze swojego programu i pobierz go po aktualizacji funkcji ; lub 2) użyj 'if (! justUpdate) {...}'. Polecam 1). To, co obecnie chcesz zrobić, to mylący sposób na uporządkowanie kodu. –

Odpowiedz

6

Poszukujesz funkcji browser.

+1

Dzięki, 'przeglądarka' to dobry wybór, ale nie doskonały. Kiedy umieściłem go w kodzie źródłowym, program zatrzymał się pomyślnie od wiersza, którego dotyczyłem, jednak monit został zmieniony na "Przeglądarka [1]>" zamiast ">", co oznacza w nowym środowisku. Chcę po prostu tego samego środowiska, w którym moje źródło zostało normalnie zakończone. – Ali

+0

Po prostu wpisz 'Q' w tym podpowiedzi, aby zamknąć okno przeglądarki i wrócić do głównego wiersza poleceń ... –

+0

@PaulHiemstra Dzięki, że zaktualizowałem to pytanie, czy masz jeszcze lepszy pomysł ? – Ali

6

Jest miły rozwiązanie na liście mailingowej here który definiuje stopQuietly funkcję, która w zasadzie ukrywa błąd pokazany z funkcji stop:

stopQuietly <- function(...) { 
    blankMsg <- sprintf("\r%s\r", paste(rep(" ", getOption("width")-1L), collapse=" ")); 
    stop(simpleError(blankMsg)); 
} # stopQuietly() 

> stopQuietly() 
+0

To rozwiązanie jest niesamowite. Dzięki! – drmariod

3

znalazłem raczej czysty roztwór here. Sztuką jest wyłączenie wszystkich komunikatów o błędach tuż przed wywołaniem stop(). Funkcja on.exit() służy do upewnienia się, że komunikaty o błędach są później ponownie włączane. Funkcja wygląda tak:

stop_quietly <- function() { 
    opt <- options(show.error.messages = FALSE) 
    on.exit(options(opt)) 
    stop() 
} 

Pierwsza linia wyłącza komunikaty o błędach i przechowuje stare ustawienia do zmiennej opt. Po tym wierszu, jakikolwiek błąd, który wystąpi, nie wyświetli komunikatu, a zatem stop() nie spowoduje wydrukowania żadnego komunikatu.

Według pomocą R,

on.exit rejestruje wyraz podany jako argument jako wymagające być wykonywane, gdy prąd wyjść funkcyjnych.

Obecna funkcja to stop_quietly() i kończy się po wywołaniu stop().Ostatnią rzeczą, którą robi program, jest wywołanie options(opt), które ustawi show.error.messages na wartość, którą miał, zanim wywołano stop_quietly() (prawdopodobnie, ale niekoniecznie, TRUE).

2

Mam podobny problem i na podstawie odpowiedzi @VangelisTasoulas otrzymałem proste rozwiązanie.
Wewnątrz funkcji, muszę sprawdzić, czy DB jest zaktualizowany. Jeśli nie, zatrzymaj wykonanie.

r=readline(prompt="Is DB updated?(y/n)") 
Is DB updated?(y/n)n 
if(r != 'y') stop('\r Update DB') 
Update DB 

tylko wprowadzenie \r na początku wiadomości, nadpisać Error: w komunikacie.

Powiązane problemy