R'nin python'daki gibi bir assert ifadesi var mı?


100

bir şeyin doğru olup olmadığını kontrol eden ve değilse belirli bir hata mesajını yazdırıp çıkan bir ifade

Yanıtlar:


123

stopifnot()

Runit gibi paketlerle de ilgilenebilir ve bunu birim testi için test edebilirsiniz.


Stopifnot () durduğunda bildirilen hata mesajını kontrol etmenin bir yolu var mı?
Nick

13
@Nick, hayır. Kullanım stopifnot()bu kodu test etmek geçerlilik testi için, bu yapıyor olması gerekenin yapıyor, ancak if (blahdiblah) stop("error message")giriş testi için, teste programa girdi geçerli olduğunu. Normal kullanım sırasında yalnızca ikincisi gerçekleşmelidir.
Harlan

6
Ayrıca assertthat, olduğundan daha iyi yanıtlar veren Hadley'in yeni paketine bakın stopifnot: github.com/hadley/assertthat
Harlan 13

12

@Nick:

Programınızda bir hata oluşturacak koşulu test etmek için açıklayıcı bir adla bir işlev yazarsanız, hata mesajınızı kontrol edebilirsiniz. İşte bir örnek:

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

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

Bu, 1'den 8'e kadar olan sayıları yazdıracak ve ardından

Error: Less_Than_8(i) is not TRUE

Parantez içindeki "i" harfinin testi geçemeyen değerle değiştirilmesi güzel olurdu, ancak ödediğinizin karşılığını alırsınız.

Bundan daha süslü bir şeye ihtiyacınız varsa, Runit'e bakın ve Harlan'ın önerdiği gibi test edin.


Fonksiyon tanımını da içine koyabilirsiniz stopifnot().
naught101

2
naught101, testin adlandırılmış bir işlevde olmasının amacı, hata mesajında ​​yazdırılan testin adını almaktır
Matthew

5

Bu, stopkomutla sağlanabilir . Bu komut, bir işlevin yürütülmesini durduracak ve hata mesajını yazdıracaktır. Örneğin, değişkenin somethingşu olup olmadığını test edebiliriz FALSE:

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

Benzer şekilde, warningkomut bir uyarı yazdıracaktır (ancak kodu yürütmeye devam edecektir).

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

Bunların her ikisi de temel R tarafından sağlanır ve hiçbir paketin çalıştırılmasını veya kendi işlevlerinizi yazmanızı gerektirmez. Bu yaklaşımı daha az bağımlılıkla kod yazmak için tercih ediyorum ve bu sözdizimi paket geliştirmede yaygın olarak kullanılıyor. Bununla birlikte, benzer işlevsellik, assert_thatHadley'in "tidyverse" in bir parçası olarak yakın zamanda piyasaya sürülen işlevle "assertthat" paketi tarafından desteklenmektedir .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.