Menu
CoddyTech

记录支出

本课属于 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
challenge icon

挑战

简单

完成第一个命令对应的 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")
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

逻辑与流程中的所有课

自己练习: R 在线编译器