[Esteartigofoipublicadopelaprimeiravezem[Thisarticlewasfirstpublishedon R – rud.is, e gentilmente contribuiu para os R-blogueiros]. (Você pode relatar um problema sobre o conteúdo desta página aqui)
Deseja compartilhar seu conteúdo com R-blogueiros? clique aqui se você tiver um blog ou aqui se não tiver.
O R 4.0.0 está fora do ar há algum tempo, agora e – além de um caso em que merge()
era mais lento que a sujeira – era realmente estável para pelo menos eu (uso diariamente no macOS, Linux e Windows). Claro, ele veio com alguns recursos / atualizações interessantes, mas comecei a examinar quais outras pepitas úteis poderiam estar no changelog e decidi postá-las no blog quando as encontrar.
A pepita de hoje é a venerável stopifnot()
função que foi significativamente aprimorada por este PR por Neil Fultz.
Antes da R 4.0.0, se você queria usar stopifnot()
para executar alguma validação de entrada (também conhecida como neste caso – [assertions]) (https://en.wikipedia.org/wiki/Assertion_ (software_development)), você faria algo assim (estou emprestando o exemplo de Neil):
some_ƒ 0),
(alpha 0),
(is.numeric(steptol)),
(length(steptol) == 1),
(steptol > 0),
(is.numeric(interlim)),
(length(interlim) == 1),
(interlim > 0)
)
message("Do something awesome")
}
Quando executado com entradas aceitáveis, obtemos:
some_ƒ(0.5, 3, 10, 100)
## Do something awesome
Mas, quando executado com algo fora de ordem:
some_ƒ("a", 3, 10, 100)
## Error in some_ƒ("a", 3, 10, 100) : (is.numeric(alpha)) is not TRUE
recebemos uma mensagem semi-útil, mas um tanto hostil de volta. Claro, ele aponta para a expressão certa, mas devemos ser a linguagem mais amável e amigável de ciência de dados (e de uso geral) que se preocupa um pouco mais com nossos usuários. Para esse fim, muitas pessoas passam a fazer algo assim:
some_ƒ 1) { stop('Error: alpha is greater than one'); }
if (!is.numeric(gradtol)) { stop('Error: gradtol should be numeric') }
if (length(gradtol) != 1) { stop('Error: gradtol should be a single value'); }
if (gradtol
o que resulta em:
some_ƒ("a", 3, 10, 100)
## Error in some_ƒ("a", 3, 10, 100) : Error: alpha should be numeric
(você pode criar mensagens de erro ainda melhores).
Neal achou que deveria haver uma maneira melhor e criou uma! o ...
expressões podem ser nomeado e esses nomes se tornarão a mensagem de erro:
some_ƒ 0),
'alpha is greater than one' = (alpha 0),
'steptol should be numeric' = (is.numeric(steptol)),
'steptol should be a single value' = (length(steptol) == 1),
'steptol should be positive' = (steptol > 0),
'iterlim should be numeric' = (is.numeric(interlim)),
'iterlim should be a single value' = (length(interlim) == 1),
'iterlim should be positive' = (interlim > 0)
)
message("Do something awesome")
}
some_ƒ("a", 3, 10, 100)
## Error in some_ƒ("a", 3, 10, 100) : alpha should be numeric
Muito mais fácil de escrever e muito mais respeitoso com o chamador.
Estatísticas Gratuitas
O CRAN possui ~ 2.600 pacotes que usam stopifnot()
no pacote deles /R/
código com as seguintes distribuições selecionadas (os gráficos têm escala log10):
Aqui estão os pacotes com 50 ou mais arquivos usando stopifnot()
:
pkg n
1 spatstat 252
2 pracma 145
3 QuACN 80
4 raster 74
5 spdep 61
6 lavaan 54
7 surveillance 53
8 copula 50
Aqui estão os pacotes com um ou mais arquivos que possuem 100 ou mais chamadas para stopifnot()
neles:
pkg fil ct
1 ff ordermerge.R 278
2 OneArmPhaseTwoStudy zzz.R 142
3 bit64 integer64.R 137
4 updog rflexdog.R 124
5 RNetCDF RNetCDF.R 123
6 Rlda rlda.R 105
7 aster2 transform.R 105
8 ads fads.R 104
9 georob georob_exported_functions.R 104
10 bit64 highlevel64.R 101
O_O Isso é um pouco de verificação!
FIN
Se você está trabalhando para mudar para o R 4.0.0 ou mudou, esse e muitos outros novos recursos aguardam! Solte uma nota nos comentários com seu novo recurso favorito (ou, melhor ainda, com um link para uma postagem no blog sobre esse recurso!).
Quando eu tiver tempo de descobrir mais algumas pepitas, adicionarei mais postagens a esta série.
Relacionado
Se você chegou até aqui, por que não inscreva-se para atualizações do site? Escolha o seu sabor: e-mail, twitter, RSS ou facebook …