Größte Ausgaben
Teil des Abschnitts Logik und Ablaufsteuerung der R-Journey von Coddy. Lektion 60 von 64.
Aufgabe
MittelFüge den Befehl TOP hinzu. Sorge dafür, dass jeder Befehl aus den vorherigen Schritten weiterhin genau wie zuvor funktioniert.
TOP <n>: Antworte mit denngrößten Ausgaben, eine pro Zeile, absteigend nach Betrag, im Format2024-05-02 rent 500.00. Ausgaben mit demselben Betrag werden nach Datum aufgelistet, das früheste zuerst. Wenn weniger alsnAusgaben vorhanden sind, liste alle auf; wenn keine vorhanden sind, antworte mitno expenses.
Der bereitgestellte Code übergibt jede Eingabezeile als einen Befehl an tracker() und gibt jede zurückgegebene Antwort in einer eigenen Zeile aus. Datumsangaben werden im Format YYYY-MM-DD geschrieben, Kategorien sind kleingeschriebene Wörter, und die Eingabe enthält nur die bisher beschriebenen Befehle.
Probier es selbst
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)))
} else if (parts[1] == "CATEGORY") {
if (nrow(expenses) == 0) {
replies <- c(replies, "no expenses")
} else {
totals <- tapply(expenses$amount, expenses$category, sum)
replies <- c(replies, sprintf("%s: %.2f", names(totals), totals))
}
}
}
replies
}
# Gelieferter Ein-/Ausgabecode: belasse ihn wie er ist
input <- suppressWarnings(readLines(file("stdin")))
cat(tracker(input), sep = "\n")
Alle Lektionen in Logik und Ablaufsteuerung
1Strings im Detail
Teilstrings mit substr()Formatierung mit sprintf()Aufteilen und VerbindenStrings durchsuchenText ersetzenWiederholung – Benutzernamen-Generator4Matrizen
Matrizen erstellenMatrizen indizierenZusammenfassungen von Zeilen und SpaltenMatrizenarithmetikRückblick – Sitzplan10Fortgeschrittener Kontrollfluss
Die switch()-FunktionVektorisierter ifelse()repeat und breakRekursive FunktionenRückblick – Notenklassifizierung2Schlüssel-Wert-Suchen
Benannte Vektor-SuchenSchlüssel prüfenSchlüssel hinzufügen und entfernenNamen durchlaufenRückblick – Aktienübersicht5Projekt – Notenbuch
Schüler hinzufügenNoten eintragen3Mengen und Zählen
Eindeutige WerteMengenoperationenZugehörigkeitstestsZählen mit table()Rückblick – Gäste einer Veranstaltung6Funktionen als Werte
Anonyme FunktionenFunktionen übergebenFunktionen zurückgebenClosures mit ZustandRückblick – Rabattregeln9Datenrahmen
Datenrahmen erstellenSpalten und ZeilenZeilen filternHinzufügen und SortierenZusammenfassung – Verkaufsbericht12Projekt – Ausgaben-Tracker
Ausgaben erfassenGesamtausgabenÜbe selbstständig: Online-R-Compiler