Kiểm tra khóa
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 8 trên 64.
Trước khi tra cứu một khóa có thể không tồn tại, hãy kiểm tra xem khóa đó có nằm trong các tên không bằng %in%:
stock <- c(apples = 12, pears = 0)
print("pears" %in% names(stock))
print("plums" %in% names(stock))Đầu ra:
[1] TRUE
[1] FALSEMột câu lệnh if quanh thao tác tra cứu sẽ cung cấp giá trị mặc định khi thiếu khóa, thay vì trả về NA hoặc gây ra lỗi:
stock <- c(apples = 12, pears = 0)
item <- "plums"
qty <- if (item %in% names(stock)) stock[[item]] else 0
print(qty)Đầu ra:
[1] 0Khóa tồn tại với giá trị 0 khác với khóa bị thiếu: pears đã có trong dữ liệu và out of stock, còn plums hoàn toàn không được bán.
Danh sách dùng cùng phép kiểm tra %in% names(). Tên không có trong danh sách sẽ trả về NULL thay vì gây lỗi, nên is.null() cũng dùng được:
user <- list(name = "Ada", city = "London")
print(is.null(user[["email"]]))
print("city" %in% names(user))Đầu ra:
[1] TRUE
[1] TRUEMột hàm trợ giúp nhỏ giúp gom việc kiểm tra vào một chỗ khi chương trình tra cứu nhiều khóa:
get_or <- function(x, key, default) {
if (key %in% names(x)) x[[key]] else default
}
stock <- c(apples = 12)
print(get_or(stock, "apples", 0))
print(get_or(stock, "kiwis", 0))Đầu ra:
[1] 12
[1] 0Thử thách
DễHoàn thiện stock_status(stock, item). Trả về unknown nếu item không phải là khóa của stock, out of stock nếu giá trị của nó là 0, còn lại trả về in stock: theo sau là số lượng.
Code được cung cấp đọc thông tin tồn kho dưới dạng các cặp name=quantity được phân tách bằng dấu phẩy, sau đó đọc mặt hàng và in ra giá trị trả về.
Tự làm thử
stock_status <- function(stock, item) {
# Viết code của bạn ở đây
""
}
# Đoạn code đầu vào/đầu ra có sẵn: giữ nguyên
input <- suppressWarnings(readLines(file("stdin")))
stock <- c()
for (pair in strsplit(input[1], ",")[[1]]) {
kv <- strsplit(pair, "=")[[1]]
stock[kv[1]] <- as.numeric(kv[2])
}
cat(stock_status(stock, input[2]), 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ếuTự luyện tập: Trình biên dịch R online