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).
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
@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ą. –
Zawsze są 'tryCatch' i' try'. – lmo