Menu
Coddy logo textTech

Spending by Category

Part of the Logic & Flow section of Coddy's R journey. Lesson 59 of 64.

challenge icon

Challenge

Easy

Add the CATEGORY command. Keep every command from the previous steps working exactly as before.

  • CATEGORY: reply with one line per category in alphabetical order, food: 20.50, with the category's total to two decimals. With nothing recorded, reply no expenses.

One CATEGORY command produces several replies, and each is printed on its own line.

The supplied code passes every input line to tracker() as one command and prints each returned reply on its own line. Dates are written YYYY-MM-DD, categories are lower-case words, and the input holds only the commands described so far.

Try it yourself

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]]
    if (parts[1] == "ADD") {
      amount <- suppressWarnings(as.numeric(parts[4]))
      if (length(parts) != 4 || is.na(amount) || amount <= 0) {
        replies <- c(replies, paste("invalid:", cmd))
      } else {
        expenses <- rbind(expenses, data.frame(date = parts[2], category = parts[3], amount = amount))
        replies <- c(replies, sprintf("added %s %.2f", parts[3], amount))
      }
    } else if (parts[1] == "TOTAL") {
      replies <- c(replies, sprintf("total: %.2f, count: %d", sum(expenses$amount), nrow(expenses)))
    }
  }
  replies
}

# Supplied input/output code: keep it as it is
input <- suppressWarnings(readLines(file("stdin")))
cat(tracker(input), sep = "\n")

All lessons in Logic & Flow

Practice on your own: Online R compiler