2011-02-04 33 views
10

Bạn có nên sử dụng các chức năng kiểm tra tiền tố/postcondition của RUnit để thực hiện các điều kiện tiên quyết/báo cáo sau điều kiện hoặc thực hiện điều này với một số tính chính xác trong hoạt động hay không?Làm thế nào để xác nhận trong R?

Trả lời

4

Tôi biết đây là một bài đăng cũ, nhưng có lẽ câu trả lời này sẽ hữu ích cho những người khác đang tìm kiếm các xác nhận R trong biểu mẫu toán tử. Đây có thể là một bước đi đúng hướng nếu bạn muốn tack một khẳng định vào cuối của một tuyên bố phiền hà.

"%assert%" <- function(e1, e2) 
{ 

    args <- as.list(match.call()[-1]) 
    defs <- as.list(args$e1) 
    preds <- as.list(args$e2)[-1L] 

    for(var in names(defs)[names(defs) != ""]) assign(var, eval(defs[[var]])) 

    for(p in unlist(preds)) eval(
     parse(
      text = paste0("if(!", deparse(p), ") stop('assertion ",deparse(p) , " is not true')") 
     ) 
    ) 

    return(eval(args$e1)) 

} 

Ví dụ: nếu bạn đang tính toán giá trị trung bình của một vector x và bạn muốn chắc chắn rằng mỗi phần tử là từ một đến mười, bạn có thể sử dụng

mean(x = sample(1:10, size = 100, replace = T)) %assert% c(min(x) > 0 && max(x) < 11) 
#5.62 

Nếu tình trạng này isn' Đúng, bạn sẽ nhận được một lỗi thông tin (ish) như

mean(x = sample(11:20, size = 100, replace = T)) %assert% c(min(x) > 0, max(x) < 11) 
#Error in eval(expr, envir, enclos) : assertion max(x) < 11 is not true 

Nó hoàn toàn chưa được kiểm tra, vì vậy hãy sử dụng với nguy hiểm của chính bạn!

20

Tôi luôn sử dụng stopifnot() để xác nhận.

+6

Được phân bổ. Thật dễ dàng, rõ ràng, nó ở trong R Base và với nó rất phổ biến. –

+2

nhưng bị dễ đọc. Tôi muốn giải thích lý do tại sao điều kiện tiên quyết thất bại và kiểm tra * chỉ đơn giản là _checkEquals (a, b, "a phải b") _ –

+0

Hoặc sử dụng 'if' +' stop' cho phép kiểm tra điều kiện và đưa ra thông báo lỗi. – nico

Các vấn đề liên quan