R tem uma declaração assert como em python?

97

uma instrução que verifica se algo é verdadeiro e se não imprime uma determinada mensagem de erro e sai

Dan
fonte

Respostas:

123

stopifnot()

Você também pode estar interessado em pacotes como Runit e testthat para testes de unidade.

Harlan
fonte
Existe uma maneira de controlar a mensagem de erro relatada se stopifnot () parar?
Nick
12
@Nick, não. Use stopifnot()para teste de validade, para testar se o código está fazendo o que deveria estar fazendo, mas if (blahdiblah) stop("error message")para teste de entrada, para testar se a entrada para o programa é válida. Apenas o último deve acontecer durante o uso normal.
Harlan
6
Veja também o novo assertthatpacote do Hadley , que dá respostas melhores do stopifnotque: github.com/hadley/assertthat
Harlan
12

@Usuario:

Você pode controlar sua mensagem de erro se escrever uma função com um nome descritivo para testar a condição que lançará um erro em seu programa. Aqui está um exemplo:

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

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

Isso imprimirá os números de 1 a 8 e, em seguida, imprimirá uma mensagem que diz

Error: Less_Than_8(i) is not TRUE

Seria bom se o "i" entre parênteses fosse substituído pelo valor que falhou no teste, mas você recebe o que paga.

Se você precisar de algo mais sofisticado do que isso, dê uma olhada em Runit e teste-o como sugeriu Harlan.

CCC
fonte
Você pode simplesmente colocar a definição da função dentro stopifnot()também.
naught101 de
2
naught101, o objetivo de ter o teste em uma função nomeada é obter o nome do teste impresso na mensagem de erro
Mateus
4

Isso pode ser feito com o stopcomando. Este comando interromperá a execução de uma função e imprimirá a mensagem de erro. Por exemplo, podemos testar se a variável somethingé FALSE:

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

Da mesma forma, o warningcomando imprimirá um aviso (mas continuará executando o código).

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

Ambos são fornecidos pela base R e não requerem pacotes para serem executados ou incluem por escrito suas próprias funções. Eu prefiro essa abordagem para escrever código com menos dependências e essa sintaxe é amplamente usada no desenvolvimento de pacotes. No entanto, funcionalidade semelhante é suportada pelo pacote "assertthat" com a assert_thatfunção que foi lançada recentemente como parte do "tidyverse" de Hadley.

Tom Kelly
fonte