R ha un'istruzione assert come in Python?


97

un'istruzione che controlla se qualcosa è vero e in caso contrario stampa un dato messaggio di errore ed esce

Risposte:


123

stopifnot()

Potresti anche essere interessato a pacchetti come Runit e testthat per i test unitari.


C'è un modo per controllare il messaggio di errore che viene segnalato se stopifnot () si ferma?
Nick

12
@ Nick, no. Utilizzare stopifnot()per il test di validità, per verificare che il codice stia facendo quello che dovrebbe fare, ma if (blahdiblah) stop("error message")per il test di input, per verificare che l'input al programma sia valido. Solo quest'ultimo dovrebbe mai accadere durante il normale utilizzo.
Harlan

6
Vedi anche il nuovo assertthatpacchetto di Hadley , che fornisce risposte migliori di quanto stopifnotnon faccia: github.com/hadley/assertthat
Harlan

12

@ Nick:

Puoi controllare il tuo messaggio di errore se scrivi una funzione con un nome descrittivo per testare la condizione che genererà un errore nel tuo programma. Ecco un esempio:

Less_Than_8 = function(x) return(x < 8)

for (i in 1:10)
{
  print(i)
  stopifnot(Less_Than_8(i))
}

Questo stamperà i numeri da 1 a 8, quindi stamperà un messaggio che dice

Error: Less_Than_8(i) is not TRUE

Sarebbe bello se la "i" tra parentesi fosse sostituita con il valore che non ha superato il test, ma ottieni quello per cui paghi.

Se hai bisogno di qualcosa di più elaborato di quello, dai un'occhiata a Runit e provalo come suggerito da Harlan.


Puoi anche inserire la definizione della funzione all'interno stopifnot().
nought101

2
naught101, lo scopo di avere il test in una funzione denominata è ottenere il nome del test stampato nel messaggio di errore
Matteo

4

Questo può essere ottenuto con il stopcomando. Questo comando interromperà l'esecuzione di una funzione e stamperà il messaggio di errore. Ad esempio, possiamo verificare se la variabile somethingè FALSE:

if(something == FALSE){
   stop("error message to print")   
}

Allo stesso modo, il warningcomando stamperà un avviso (ma continuerà a eseguire il codice).

if(something == FALSE){
   warning("error message to print")   
}

Questi sono entrambi forniti dalla base R e non richiedono pacchetti per essere eseguiti o includere nella scrittura le proprie funzioni. Preferisco questo approccio per scrivere codice con meno dipendenze e questa sintassi è ampiamente utilizzata nello sviluppo di pacchetti. Tuttavia, funzionalità simili sono supportate dal pacchetto "assertthat" con la assert_thatfunzione che è stata recentemente rilasciata come parte del "tidyverse" di Hadley.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.