R có câu lệnh khẳng định như trong python không?


97

một câu lệnh kiểm tra xem điều gì đó là đúng và nếu không sẽ in một thông báo lỗi nhất định và thoát

Câu trả lời:


123

stopifnot()

Bạn cũng có thể quan tâm đến các gói như Runittestthat để thử nghiệm đơn vị.


Có cách nào để kiểm soát thông báo lỗi được báo cáo nếu stopifnot () dừng lại không?
Nick

12
@Nick, không. Sử dụng stopifnot()để kiểm tra tính hợp lệ, để kiểm tra mã đó đang làm những gì nó phải làm, nhưng if (blahdiblah) stop("error message")để kiểm tra đầu vào, để kiểm tra xem đầu vào của chương trình có hợp lệ hay không. Chỉ có điều sau sẽ xảy ra trong quá trình sử dụng bình thường.
Harlan

6
Xem thêm assertthatgói mới của Hadley , cung cấp câu trả lời tốt hơn stopifnothiện tại: github.com/hadley/assertthat
Harlan

12

@Nick:

Bạn có thể kiểm soát thông báo lỗi của mình nếu bạn viết một hàm có tên mô tả để kiểm tra điều kiện sẽ tạo ra lỗi trong chương trình của bạn. Đây là một ví dụ:

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

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

Thao tác này sẽ in các số từ 1 đến 8, sau đó in một thông báo cho biết

Error: Less_Than_8(i) is not TRUE

Sẽ thật tuyệt nếu chữ "i" trong ngoặc đơn được thay thế bằng giá trị không thành công trong bài kiểm tra, nhưng bạn sẽ nhận được những gì bạn phải trả.

Nếu bạn cần bất kỳ thứ gì lạ hơn thế, hãy tìm đến Runit và thử nghiệm điều đó như Harlan đã đề xuất.


Bạn cũng có thể đặt định nghĩa hàm bên trong stopifnot().
naught101

2
naught101, điểm của việc kiểm tra trong một hàm có tên là lấy tên của bài kiểm tra được in trong thông báo lỗi
Matthew

4

Điều này có thể đạt được bằng stoplệnh. Lệnh này sẽ tạm dừng việc thực thi một hàm và in ra thông báo lỗi. Ví dụ, chúng ta có thể kiểm tra xem biến somethingcó phải là FALSE:

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

Tương tự, warninglệnh sẽ in cảnh báo (nhưng vẫn tiếp tục thực thi mã).

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

Cả hai đều được cung cấp bởi cơ sở R và không yêu cầu gói nào để chạy hoặc bao gồm việc viết các hàm của riêng bạn. Tôi thích cách tiếp cận này để viết mã với ít phụ thuộc hơn và cú pháp này được sử dụng rộng rãi trong phát triển gói. Tuy nhiên, chức năng tương tự được hỗ trợ bởi gói "khẳng định" với assert_thatchức năng đã được phát hành gần đây như một phần của "ngăn nắp" của Hadley.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.