记录支出
本课属于 Coddy R 学习旅程的“逻辑与流程”单元。第 57 课,共 64 课。
在这个项目中,你将构建一个费用跟踪器,它会逐行读取命令。通过 5 个步骤,你会逐步学会记录费用、报告总额、按类别归组支出、列出金额最大的费用,以及汇总某个月份的支出。每个步骤都会扩展同一个 tracker(commands) 函数。
ADD 2024-05-01 food 12.50
ADD 2024-05-02 rent 500
TOTAL
CATEGORY
TOP 2
MONTH 2024-05支出保存在一个数据框中,每笔支出占一行。数据框开始时有三个类型正确的空列,rbind() 会为每个有效的 ADD 添加一行:
expenses <- data.frame(date = character(0), category = character(0), amount = numeric(0))
expenses <- rbind(expenses, data.frame(date = "2024-05-01", category = "food", amount = 12.5))
print(nrow(expenses))
print(expenses$amount)输出:
[1] 1
[1] 12.5一条 ADD 命令必须包含 4 个部分,并且金额必须为正数。使用 suppressWarnings(as.numeric()) 转换金额,这样无效值会得到 NA,而不会产生警告,然后在添加行之前检查金额:
parts <- strsplit("ADD 2024-05-01 food abc", " ")[[1]]
amount <- suppressWarnings(as.numeric(parts[4]))
print(length(parts) == 4 && !is.na(amount) && amount > 0)输出:
[1] FALSE挑战
简单完成第一个命令对应的 tracker(commands):
ADD <date> <category> <amount>:如果这一行恰好有四个部分,且金额是大于 0 的数字,就添加这笔支出,并回复added <category> <amount>,金额保留两位小数,例如added food 12.50。否则,回复invalid:,后面跟上完整命令。
提供的代码会把每一行输入作为一个命令传给 tracker(),并将每条返回的回复单独打印在一行上。日期格式为 YYYY-MM-DD,类别是小写单词,输入中只包含目前介绍过的命令。
亲手试试
tracker <- function(commands) {
expenses <- data.frame(date = character(0), category = character(0), amount = numeric(0))
replies <- c()
for (cmd in commands) {
parts <- strsplit(cmd, " ")[[1]]
# 在这里编写你的代码
}
replies
}
# 提供的输入和输出代码:保持原样
input <- suppressWarnings(readLines(file("stdin")))
cat(tracker(input), sep = "\n")
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: R 在线编译器