Ghi lại các khoản chi
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 57 trên 64.
Trong dự án này, bạn sẽ xây dựng một trình theo dõi chi tiêu đọc các lệnh, mỗi dòng một lệnh. Qua năm bước, chương trình sẽ ghi lại các khoản chi, báo cáo tổng số tiền, nhóm chi tiêu theo danh mục, liệt kê các khoản chi lớn nhất và tổng hợp chi tiêu trong một tháng. Mỗi bước mở rộng cùng một hàm tracker(commands).
ADD 2024-05-01 food 12.50
ADD 2024-05-02 rent 500
TOTAL
CATEGORY
TOP 2
MONTH 2024-05Các khoản chi nằm trong một khung dữ liệu, mỗi hàng ứng với một khoản chi. Khung dữ liệu bắt đầu với ba cột trống có kiểu dữ liệu phù hợp, còn rbind() thêm một hàng cho mỗi ADD hợp lệ:
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)Đầu ra:
[1] 1
[1] 12.5Một dòng ADD phải có bốn phần và một số tiền dương. Chuyển đổi số tiền bằng suppressWarnings(as.numeric()) để giá trị không hợp lệ cho kết quả NA thay vì cảnh báo, rồi kiểm tra trước khi thêm hàng:
parts <- strsplit("ADD 2024-05-01 food abc", " ")[[1]]
amount <- suppressWarnings(as.numeric(parts[4]))
print(length(parts) == 4 && !is.na(amount) && amount > 0)Đầu ra:
[1] FALSEThử thách
DễHoàn thiện tracker(commands) cho lệnh đầu tiên:
ADD <date> <category> <amount>: nếu dòng có đúng bốn phần và số tiền lớn hơn 0, hãy thêm khoản chi và trả lờiadded <category> <amount>với số tiền có hai chữ số thập phân, chẳng hạn nhưadded food 12.50. Nếu không, hãy trả lờiinvalid:theo sau là toàn bộ lệnh.
Code được cung cấp chuyển từng dòng đầu vào cho tracker() dưới dạng một lệnh và in mỗi câu trả lời được trả về trên một dòng riêng. Ngày được viết theo định dạng YYYY-MM-DD, danh mục là các từ viết thường, và dữ liệu đầu vào chỉ chứa những lệnh đã mô tả đến đây.
Tự làm thử
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]]
# Viết code của bạn ở đây
}
replies
}
# Đoạn code đầu vào/đầu ra có sẵn: giữ nguyên
input <- suppressWarnings(readLines(file("stdin")))
cat(tracker(input), 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ểm3Tập hợp và đếm
Các giá trị duy nhấtCác phép toán trên tập hợpKiểm tra phần tửĐếm bằng table()Ôn tập: Khách mời sự kiện12Dự án: Theo dõi chi tiêu
Ghi lại các khoản chiTổng chi tiêuTự luyện tập: Trình biên dịch R online