¿R tiene una declaración de aserción como en Python?

Respuestas:

123

stopifnot()

También puede estar interesado en paquetes como Runit y testthat para pruebas unitarias.

Harlan
fuente
¿Hay alguna forma de controlar el mensaje de error que se informa si stopifnot () se detiene?
Nick
12
@Nick, no. Úselo stopifnot()para pruebas de validez, para probar que el código está haciendo lo que se supone que debe hacer, pero if (blahdiblah) stop("error message")para pruebas de entrada, para probar que la entrada al programa es válida. Solo esto último debería ocurrir durante el uso normal.
Harlan
6
Consulte también el nuevo assertthatpaquete de Hadley , que ofrece mejores respuestas que las que stopifnotofrece: github.com/hadley/assertthat
Harlan
12

@Mella:

Puede controlar su mensaje de error si escribe una función con un nombre descriptivo para probar la condición que arrojará un error en su programa. He aquí un ejemplo:

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

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

Esto imprimirá los números del 1 al 8, luego imprimirá un mensaje que dice

Error: Less_Than_8(i) is not TRUE

Sería bueno si la "i" entre paréntesis fuera reemplazada por el valor que no pasó la prueba, pero obtienes lo que pagas.

Si necesita algo más elegante que eso, busque en Runit y pruébelo como sugirió Harlan.

CCC
fuente
También puede poner la definición de la función dentro stopifnot().
naught101
2
naught101, el objetivo de tener la prueba en una función con nombre es imprimir el nombre de la prueba en el mensaje de error
Mateo
4

Esto se puede lograr con el stopcomando. Este comando detendrá la ejecución de una función e imprimirá el mensaje de error. Por ejemplo, podemos probar si la variable somethinges FALSE:

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

De manera similar, el warningcomando imprimirá una advertencia (pero continuará ejecutando el código).

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

Ambos son proporcionados por base R y no requieren paquetes para ejecutar o incluir por escrito sus propias funciones. Prefiero este enfoque para escribir código con menos dependencias y esta sintaxis se usa ampliamente en el desarrollo de paquetes. Sin embargo, el paquete "assertthat" admite una funcionalidad similar con la assert_thatfunción que se ha lanzado recientemente como parte del "tidyverse" de Hadley.

Tom Kelly
fuente