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).
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
@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. –
Luôn có 'tryCatch' và' try'. – lmo