Cảnh báo và finally
Thuộc phần Logic và luồng điều khiển trong hành trình R của Coddy. Bài học 54 trên 64.
Cảnh báo báo về sự cố nhưng không dừng chương trình: hàm trả về một giá trị và R in cảnh báo ở cuối. as.numeric() cảnh báo khi gặp văn bản không phải là số và trả về NA:
x <- as.numeric("abc")
print(x)Đầu ra:
[1] NA
Warning message:
NAs introduced by coercion Giống như lỗi, cảnh báo được gửi đến luồng lỗi, nên trên Coddy chúng khiến test không đạt. suppressWarnings() chặn cảnh báo khi bạn tự kiểm tra kết quả, còn tryCatch(..., warning = ) chuyển cảnh báo thành một giá trị:
x <- suppressWarnings(as.numeric("abc"))
print(is.na(x))
r <- tryCatch(as.numeric("abc"), warning = function(w) paste("warned:", conditionMessage(w)))
print(r)Đầu ra:
[1] TRUE
[1] "warned: NAs introduced by coercion"warning("message") phát ra một cảnh báo từ code của chính bạn. Bộ xử lý cảnh báo hoạt động giống như bộ xử lý lỗi:
ratio <- function(a, b) {
if (b == 0) warning("b is zero, returning Inf")
a / b
}
r <- tryCatch(ratio(1, 0), warning = function(w) conditionMessage(w))
print(r)Đầu ra:
[1] "b is zero, returning Inf"finally = ... chạy sau biểu thức và mọi trình xử lý, bất kể có xảy ra lỗi hay không. Dùng nó cho những việc luôn phải thực hiện, chẳng hạn như in thông báo khi kết thúc:
load <- function(x) {
tryCatch({
if (x < 0) stop("negative")
x * 10
}, error = function(e) NA,
finally = cat("finished", x, "\n"))
}
print(load(2))
print(load(-1))Đầu ra:
finished 2
[1] 20
finished -1
[1] NAThử thách
DễHoàn thiện to_numbers(texts). Chuyển từng văn bản thành một số. Những giá trị không thể chuyển đổi sẽ trở thành NA mà không in ra cảnh báo nào. Trả về hai dòng: Numbers: cùng các số đã chuyển đổi, được nối với nhau bằng dấu cách (bao gồm cả các giá trị NA), và Invalid: cùng số lượng giá trị chuyển đổi không thành công.
Code được cung cấp đọc các văn bản từ một dòng có các giá trị được phân tách bằng dấu phẩy và in ra từng dòng được trả về.
Tự làm thử
to_numbers <- function(texts) {
# Viết code của bạn ở đây
c("Numbers: ", "Invalid: 0")
}
# Đoạn code đầu vào/đầu ra có sẵn: giữ nguyên
input <- suppressWarnings(readLines(file("stdin")))
cat(to_numbers(strsplit(input[1], ",")[[1]]), sep = "\n")
Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Logic và luồng điều khiển
1Chuỗi chuyên sâu
Chuỗi con với substr()Định dạng với sprintf()Tách và nối chuỗiTìm kiếm trong chuỗiThay thế văn bảnÔn tập: Tạo tên người dùng10Luồng điều khiển nâng cao
Hàm switch()ifelse() dạng vector hóarepeat và breakHàm đệ quyÔn tập: phân loại điểm2Tra cứu khóa-giá trị
Tra cứu vector theo tênKiểm tra khóaThêm và xóa khóaLặp qua các tênÔn tập: Bàn giao dịch cổ phiếu11Xử lý lỗi
Phát sinh lỗi với stop()Bắt lỗi với tryCatch()Cảnh báo và finallyKiểm tra đầu vàoÔn tập: Máy tính an toànTự luyện tập: Trình biên dịch R online