2017-02-15 21 views
7

Khi thực thi một khối mã trong RStudio, thực thi không thực sự dừng khi xảy ra lỗi. Ví dụ, nếu tôi có đoạn mã sau trong trình soạn thảo mở:Thực hiện dừng khi lỗi trong phiên RStudio/Interactive R

x <- 'test' 
stopifnot(is.numeric(x)) 
print('hello world') 

Và chạy nó (hoặc với lệnh trả lại hoặc bằng cách nhấn vào nút "Run"), nó in lỗi nhưng sau đó tiến bước trên và thực thi báo cáo in.

Có cách nào để định cấu hình RStudio không tiến hành lỗi này không? tức là làm cho nó dừng ở dòng 2 ở trên và không tiến hành tuyên bố in?

EDIT: Chỉ cần nhận ra điều này cũng xảy ra nếu tôi gửi khối mã trong giao diện R chuẩn bằng lệnh-R.

+0

Nếu bạn thực thi điều này dưới dạng tệp nguồn, thì nó sẽ hoạt động như bạn muốn. Nếu bạn, ví dụ như sao chép và dán 3 dòng mã vào giao diện điều khiển và nhấn Enter, sau đó nó sẽ chạy mỗi dòng mã riêng biệt. Chế độ thứ hai này có khả năng là nút Run hoạt động dưới. – lmo

+1

@lmo cảm ơn - vấn đề là hầu hết mọi người tôi biết chương trình tương tác. Tôi đang cố viết một hướng dẫn cho các nhà khoa học xã hội để đưa các bài kiểm tra vào mã của họ, và cần gặp họ ở đâu. –

+0

Luôn có 'tryCatch' và' try'. – lmo

Trả lời

0

Tôi không nghĩ rằng có một cách để ngăn RStudio chạy tất cả các dòng, khi bạn chọn một phần và nhấn Ctrl + Enter. Rstudio chỉ là chạy một dòng sau khi khác. Ngay cả khi stopifnot() được gọi bên trong một hàm, tất cả các dòng sau khi cuộc gọi hàm đó vẫn sẽ được đánh giá.

Nếu mục tiêu của bạn chỉ đơn giản là được thông báo khi có sự cố, trước khi nhiều mã được chạy vô ích, có thể bạn có thể xác định một hàm tương tự như stopifnot() mà sẽ đi vào vòng lặp vô tận, nếu có lỗi . Sau đó, bạn có thể nhấn Esc hoặc nút Dừng trong RStudio để làm gián đoạn chương trình. Một cái gì đó như thế này:

waitifnot <- function(cond) { 
    if (!cond) { 
    message(deparse(substitute(cond)), " is not TRUE") 
    while (TRUE) {} 
    } 
} 

Bây giờ, bạn có thể chạy mã ví dụ của bạn với chức năng này:

x <- 'test' 
waitifnot(is.numeric(x)) 
print('hello world') 

Đúng như dự đoán, hello world không bao giờ được in ra. Bạn sẽ nhận được một thông báo lỗi, nói với bạn rằng đã xảy ra sự cố và sau đó chương trình sẽ đợi cho đến khi bạn hủy theo cách thủ công.

Điều này sẽ không hoạt động tốt trong mọi tình huống ngoài chế độ tương tác. Để tránh những tình huống khó chịu, bạn cũng có thể để cho các chức năng phản ứng khác nhau, nếu nó không được sử dụng trong chế độ tương tác, ví dụ như thế này:

waitifnot <- function(cond) { 
    if (!cond) { 
    msg <- paste(deparse(substitute(cond)), "is not TRUE") 
    if (interactive()) { 
     message(msg) 
     while (TRUE) {} 
    } else { 
     stop(msg) 
    } 
    } 
} 

Chức năng này sẽ đi vào một vòng lặp vô tận chỉ khi chạy trong chế độ tương tác. Nếu không, nó sẽ đơn giản hủy bỏ việc thực hiện bằng cách gọi stop(). Tôi đã kiểm tra xem nó hoạt động như mong đợi với Ctrl + Enter hay nút Source trong RStudio (vòng lặp vô tận) và với Rscript trên dòng lệnh Bash (hủy bỏ chương trình).

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