2017-02-15 22 views
7

Podczas wykonywania bloku kodu w aplikacji RStudio wykonywanie nie zatrzymuje się automatycznie po wystąpieniu błędu. Na przykład, jeśli mam następujący kod w otwartym edytorze:Zatrzymanie wykonywania w przypadku błędu w sesji RStudio/Interactive R

x <- 'test' 
stopifnot(is.numeric(x)) 
print('hello world') 

i uruchom go (albo z polecenia zwrotu lub klikając przycisk „Run”), to wyświetla się błąd, ale potem idzie naprzód i wykonuje instrukcja drukowania.

Czy istnieje sposób, aby skonfigurować RStudio, aby nie przechodziło poza błąd? tzn. czy zatrzyma się na linii 2 powyżej i nie przechodzi do instrukcji drukowania?

EDYCJA: Właśnie zdałem sobie z tego sprawę, jeśli wysyłam bloki kodu w standardowym GU GU za pomocą polecenia-R.

+0

Jeśli wykonasz to jako plik źródłowy, to będzie działać tak, jak chcesz. Jeśli np. Skopiujesz i wkleisz 3 wiersze kodu do konsoli i wciśniesz Enter, to każda linia kodu zostanie uruchomiona osobno. Ten drugi tryb prawdopodobnie działa pod przyciskiem Run. – lmo

+1

@lmo dzięki - problem polega na tym, że większość ludzi zna program interaktywnie. Próbuję napisać samouczek dla naukowców zajmujących się naukami społecznymi, aby umieścić testy w ich kodzie i muszą się z nimi spotkać tam, gdzie są. –

+0

Zawsze są 'tryCatch' i' try'. – lmo

Odpowiedz

0

Nie sądzę, że istnieje sposób, aby uniemożliwić RStudio uruchamianie wszystkich linii, po wybraniu sekcji i naciśnięciu Ctrl + Enter. Rstudio uruchamia jedną linię po drugiej. Nawet jeśli stopifnot() zostanie wywołany wewnątrz funkcji, wszystkie linie po tej funkcji będą nadal oceniane.

Jeśli Twoim celem jest po prostu informacja, kiedy coś pójdzie nie tak, zanim wiele kodu zostanie uruchomione na próżno, być może możesz zdefiniować funkcję podobną do stopifnot(), która przejdzie w nieskończoną pętlę, jeśli wystąpi błąd . Następnie możesz nacisnąć Esc lub przycisk Stop w RStudio, aby przerwać program. Coś takiego:

waitifnot <- function(cond) { 
    if (!cond) { 
    message(deparse(substitute(cond)), " is not TRUE") 
    while (TRUE) {} 
    } 
} 

Teraz można uruchomić przykładowy kod z tej funkcji:

x <- 'test' 
waitifnot(is.numeric(x)) 
print('hello world') 

Zgodnie z oczekiwaniami, hello world nigdy nie zostanie wydrukowany. Otrzymasz komunikat o błędzie z informacją, że coś poszło nie tak, a następnie program będzie czekał, aż ręcznie go usuniesz.

Nie będzie dobrze działać w żadnej innej sytuacji niż tryb interaktywny. Aby uniknąć nieprzyjemnych sytuacji, można także pozwolić funkcja różnie reagują, gdy nie jest używany w trybie interaktywnym, na przykład tak:

waitifnot <- function(cond) { 
    if (!cond) { 
    msg <- paste(deparse(substitute(cond)), "is not TRUE") 
    if (interactive()) { 
     message(msg) 
     while (TRUE) {} 
    } else { 
     stop(msg) 
    } 
    } 
} 

Funkcja ta wejdzie w nieskończoną pętlę tylko wtedy, gdy uruchomiony w trybie interaktywnym. W przeciwnym razie po prostu przerwie wykonywanie, dzwoniąc pod numer stop(). Sprawdziłem, czy działa to zgodnie z oczekiwaniami, naciskając Ctrl + Enter lub przycisk Source w RStudio (pętla nieskończona) i Rscript w wierszu poleceń Bash (przerwij program).

Powiązane problemy