Skip to content
Snippets Groups Projects
Select Git revision
  • 9fa45f85b5ba4827d3a9f9bb704a076a06f2d4ef
  • main default protected
2 results

lies_aktuellen_stand.R

Blame
  • lies_aktuellen_stand.R 16.47 KiB
    # Library-Aufrufe kann man sich eigentlich sparen, aber...
    library(readr)
    library(lubridate)
    library(tidyr)
    library(stringr)
    library(dplyr)
    library(openxlsx)
    library(curl)
    
    # lies_aktuellen_stand.R
    #
    # Enthält die Funktion zum Lesen der aktuellen Daten. 
    
    #---- Hilfsfunktionen ----
    
    archiviere <- function(df,a_directory = "daten/stimmbezirke") {
      #' Schreibt das Dataframe mit den zuletzt geholten Stimmbezirks-Daten
      #' als Sicherungskopie in das angegebene Verzeichnis
      #' 
      if (!dir.exists(a_directory)) {
        dir.create(a_directory)
      }
      fname = paste0(a_directory,"/",
                    # Zeitstempel isolieren und alle Doppelpunkte
                    # durch Bindestriche ersetzen
                    str_replace_all(df %>% pull(zeitstempel) %>% last(),
                                    "\\:","_"),
                    ".csv")
      write_csv(df,fname)
      cat(as.character(now())," - Daten archiviert als ",paste0(a_directory,fname))
    }
    
    hole_letztes_df <- function(a_directory = "daten/stimmbezirke") {
      #' Schaut im angegebenen Verzeichnis nach der zuletzt angelegten Datei
      #' und holt die Daten zurück in ein df
      if (!dir.exists(a_directory)) return(tibble())
      # Die zuletzt geschriebene Datei finden und einlesen
      neuester_file <- list.files(a_directory, full.names=TRUE) %>% 
        file.info() %>% 
        # Legt eine Spalte namens path an
        tibble::rownames_to_column(var = "path") %>% 
        arrange(desc(ctime)) %>% 
        head(1) %>% 
        # Pfad wieder rausziehen
        pull(path)
      if (length(neuester_file)==0) {
        # Falls keine Daten archiviert, gibt leeres df zurück
        return(tibble())
      } else {
        return(read_csv(neuester_file))
      }
    }
    
    # Sind die beiden df abgesehen vom Zeitstempel identisch?
    # Funktion vergleicht die numerischen Werte - Spalte für Spalte.
    vergleiche_stand <- function(alt_df, neu_df) {
      #' Spaltenweiser Vergleich: Haben die Daten sich verändert? 
      #' (Anders gefragt: ist die Summe aller numerischen Spalten gleich?)
      #' Wurde für die Feldmann-Wahl benötigt; bei OB-Wahlen eigentlich überflüssig
      neu_sum_df <- alt_df %>% summarize_if(is.numeric,sum,na.rm=T)
      alt_sum_df <- neu_df %>% summarize_if(is.numeric,sum,na.rm=T)
      # Unterschiedliche Spaltenzahlen? Dann können sie keine von Finns Männern sein.
      if (length(neu_sum_df) != length(alt_sum_df)) return(FALSE)
      # Differenzen? Dann können sie keine von Finns Männern sein. 
      return(sum(abs(neu_sum_df - alt_sum_df))==0)
    }
    
    
    #--- CURL-Polling (experimentell!)
    #