检查键
本课属于 Coddy R 学习旅程的“逻辑与流程”单元。第 8 课,共 64 课。
查找可能缺失的键之前,先用 %in% 检查它是否在名称中:
stock <- c(apples = 12, pears = 0)
print("pears" %in% names(stock))
print("plums" %in% names(stock))输出:
[1] TRUE
[1] FALSE在查找外面加上 if,可以为缺失的键提供默认值,而不是返回 NA 或报错:
stock <- c(apples = 12, pears = 0)
item <- "plums"
qty <- if (item %in% names(stock)) stock[[item]] else 0
print(qty)输出:
[1] 0值为 0 的现有键与缺失的键不同:pears 是已知的,且 out of stock;plums 则根本没有出售。
列表使用相同的 %in% names() 检查。列表中缺少名称时会返回 NULL,而不是报错,因此 is.null() 也适用:
user <- list(name = "Ada", city = "London")
print(is.null(user[["email"]]))
print("city" %in% names(user))输出:
[1] TRUE
[1] TRUE当程序要查找多个键时,可以用一个小辅助函数把检查逻辑集中在一处:
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))输出:
[1] 12
[1] 0挑战
简单完成 stock_status(stock, item)。如果 item 不是 stock 的键,则返回 unknown;如果它的值为 0,则返回 out of stock;否则返回 in stock: ,后面跟上数量。
提供的代码会读取以逗号分隔的 name=quantity 对作为库存,然后读取商品,并打印返回的值。
亲手试试
stock_status <- function(stock, item) {
# 在这里编写你的代码
""
}
# 提供的输入输出代码:保持原样
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")
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: R 在线编译器