Apakah R memiliki pernyataan assert seperti pada python?

97

pernyataan yang memeriksa apakah sesuatu itu benar dan jika tidak mencetak pesan kesalahan yang diberikan dan keluar

Dan
sumber

Jawaban:

123

stopifnot()

Anda mungkin juga tertarik dengan paket seperti Runit dan testthat untuk pengujian unit.

Harlan
sumber
Apakah ada cara untuk mengontrol pesan kesalahan yang dilaporkan jika stopifnot () berhenti?
Nick
12
@Nick, tidak. Gunakan stopifnot()untuk pengujian validitas, untuk menguji kode itu melakukan apa yang seharusnya dilakukan, tetapi if (blahdiblah) stop("error message")untuk pengujian input, untuk menguji apakah input ke program itu valid. Hanya yang terakhir yang boleh terjadi selama penggunaan normal.
Harlan
6
Lihat juga assertthatpaket baru Hadley , yang memberikan jawaban lebih baik daripada stopifnot: github.com/hadley/assertthat
Harlan
12

@Nick:

Anda dapat mengontrol pesan kesalahan Anda jika Anda menulis fungsi dengan nama deskriptif untuk menguji kondisi yang akan menimbulkan kesalahan dalam program Anda. Berikut contohnya:

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

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

Ini akan mencetak angka 1 hingga 8, lalu mencetak pesan yang bertuliskan

Error: Less_Than_8(i) is not TRUE

Alangkah baiknya jika "i" dalam tanda kurung diganti dengan nilai yang gagal dalam ujian, tetapi Anda mendapatkan apa yang Anda bayar.

Jika Anda membutuhkan sesuatu yang lebih mewah dari itu, lihat Runit dan uji seperti yang disarankan Harlan.

CCC
sumber
Anda bisa meletakkan definisi fungsi di dalamnya stopifnot()juga.
n nothing101
2
naught101, tujuan memiliki tes dalam fungsi bernama adalah untuk mendapatkan nama tes dicetak dalam pesan kesalahan
Matius
4

Ini bisa dicapai dengan stopperintah. Perintah ini akan menghentikan eksekusi suatu fungsi dan mencetak pesan kesalahan. Sebagai contoh, kita dapat menguji apakah variabel somethingadalah FALSE:

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

Demikian pula, warningperintah akan mencetak peringatan (tetapi terus mengeksekusi kode).

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

Keduanya disediakan oleh basis R dan tidak memerlukan paket untuk menjalankan atau menyertakan fungsi Anda sendiri secara tertulis. Saya lebih suka pendekatan ini untuk menulis kode dengan lebih sedikit ketergantungan dan sintaks ini banyak digunakan dalam pengembangan paket. Namun, fungsionalitas serupa didukung oleh paket "assertthat" dengan assert_thatfungsi yang baru-baru ini dirilis sebagai bagian dari "tidyverse" Hadley.

Tom Kelly
sumber