Menu
CoddyTech

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] FALSE

Mộ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] 0

Khó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] TRUE

Mộ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] 0
challenge icon

Thử 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")
quiz iconTự kiểm tra

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

Tự luyện tập: Trình biên dịch R online