From ecb5677703f9f10ac0bff9fb58ce2a6b5419681a Mon Sep 17 00:00:00 2001 From: flavis Date: Wed, 11 Aug 2021 09:15:26 +0200 Subject: [PATCH 1/7] add bare read_from_csv_or_fetch --- NAMESPACE | 1 + R/parse.R | 15 +++++++++++++++ vignettes/explicittopic.Rmd | 5 +++-- vignettes/genderequality.Rmd | 7 +++++-- vignettes/generalquestions.Rmd | 5 +++-- vignettes/hitlercomparison.Rmd | 5 +++-- vignettes/interaction.Rmd | 5 +++-- 7 files changed, 33 insertions(+), 10 deletions(-) diff --git a/NAMESPACE b/NAMESPACE index 3d291b9..c5f1962 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -7,6 +7,7 @@ export(join_speaker) export(party_colors) export(read_all) export(read_from_csv) +export(read_from_csv_or_fetch) export(repair) export(word_usage_by_date) export(write_to_csv) diff --git a/R/parse.R b/R/parse.R index 80bb2f6..8ab01be 100644 --- a/R/parse.R +++ b/R/parse.R @@ -271,3 +271,18 @@ read_from_csv <- function(path="inst/csv/") { is_valid_res(res) res } + +#' @export +read_from_csv_or_fetch <- function(path="inst/") { + path <- make_directory_path(path) + res <- tryCatch(read_from_csv(str_c(path, "csv/")), + error = function(c) NULL) + if (!is.null(res)) return(res) + + fetch_all(str_c(path, "records/"), create=T) + read_all(str_c(path, "records/")) %>% + repair() -> + res + write_to_csv(res, str_c(path, "csv/"), create=T) + res +} diff --git a/vignettes/explicittopic.Rmd b/vignettes/explicittopic.Rmd index 18f330d..c406f33 100644 --- a/vignettes/explicittopic.Rmd +++ b/vignettes/explicittopic.Rmd @@ -34,9 +34,10 @@ read_all("../inst/records/") %>% repair() -> res ``` We also used `repair` to fix a bunch of formatting issues in the records. -For development purposes, we load the tables from csv files. +For development purposes, we only fetch records if they are not already +stored as csv files: ```{r} -res <- read_from_csv('../inst/csv/') +res <- read_from_csv_or_fetch('../inst/') ``` ## Analysis diff --git a/vignettes/genderequality.Rmd b/vignettes/genderequality.Rmd index 0e9ea15..4c49634 100644 --- a/vignettes/genderequality.Rmd +++ b/vignettes/genderequality.Rmd @@ -35,10 +35,13 @@ read_all("../records/") %>% repair() -> res ``` We also used `repair` to fix a bunch of formatting issues in the records. -For development purposes, we load the tables from csv files. +For development purposes, we only fetch records if they are not already +stored as csv files: ```{r} -res <- read_from_csv('../inst/csv/') +res <- read_from_csv_or_fetch('../inst/') ``` + + and unpack our tibbles ```{r} comments <- res$comments diff --git a/vignettes/generalquestions.Rmd b/vignettes/generalquestions.Rmd index 09164f8..14187e7 100644 --- a/vignettes/generalquestions.Rmd +++ b/vignettes/generalquestions.Rmd @@ -34,9 +34,10 @@ read_all("../inst/records/") %>% repair() -> res ``` We also used `repair` to fix a bunch of formatting issues in the records. -For development purposes, we load the tables from csv files. +For development purposes, we only fetch records if they are not already +stored as csv files: ```{r} -res <- read_from_csv('../inst/csv/') +res <- read_from_csv_or_fetch('../inst/') ``` ## Analysis diff --git a/vignettes/hitlercomparison.Rmd b/vignettes/hitlercomparison.Rmd index f7b2999..7f77cc9 100644 --- a/vignettes/hitlercomparison.Rmd +++ b/vignettes/hitlercomparison.Rmd @@ -38,9 +38,10 @@ talks <- res$talks We also used `repair` to fix a bunch of formatting issues in the records and unpacked the result into more descriptive variables. -For development purposes, we load the tables from csv files. +For development purposes, we only fetch records if they are not already +stored as csv files: ```{r} -tables <- read_from_csv('../inst/csv/') +tables <- read_from_csv_or_fetch('../inst/') comments <- tables$comments speeches <- tables$speeches diff --git a/vignettes/interaction.Rmd b/vignettes/interaction.Rmd index 2b60ddf..b308d3d 100644 --- a/vignettes/interaction.Rmd +++ b/vignettes/interaction.Rmd @@ -34,9 +34,10 @@ read_all("../inst/records/") %>% repair() -> res ``` We also used `repair` to fix a bunch of formatting issues in the records. -For development purposes, we load the tables from csv files. +For development purposes, we only fetch records if they are not already +stored as csv files: ```{r} -res <- read_from_csv('../inst/csv/') +res <- read_from_csv_or_fetch('../inst/') ``` ## Analysis From 896ba1b3b0bfd639b0fa7b0f8cf51de9cc0bf32c Mon Sep 17 00:00:00 2001 From: flavis Date: Wed, 11 Aug 2021 09:18:17 +0200 Subject: [PATCH 2/7] update readme for new vignette building workflow --- README.md | 21 +-------------------- 1 file changed, 1 insertion(+), 20 deletions(-) diff --git a/README.md b/README.md index 9f1d6c1..69de28d 100644 --- a/README.md +++ b/README.md @@ -9,26 +9,7 @@ Using the `remotes` package, this is easily installed via: ```r remotes::install_url("https://git.flavigny.de/christian/hateimparlament/archive/master.zip") ``` -Since the fetching and reading is very slow and depends on an internet connection, all vignettes -use `read_from_csv` to read already parsed tibbles from `.csv` files. - -That's why, if you want to build the vignettes yourself, you need to -download the source code, e.g. on Linux -``` -git clone https://git.flavigny.de/christian/hateimparlament -cd hateimparlament -``` -then start `R` and do -```r -devtools::load_all() -fetch_all(create = TRUE) -read_all() %>% repair() -> res -write_to_csv(res, create = TRUE) -``` -Then finally, do: -```r -devtools::install(build_vignettes = TRUE) -``` +If you want to build the vignettes, pass `build_vignettes = TRUE`. # Features From b7166d157883c25a77e600847b5249397d3fe597 Mon Sep 17 00:00:00 2001 From: JosuaKugler Date: Wed, 11 Aug 2021 16:04:56 +0200 Subject: [PATCH 3/7] add documentation for read_from_csv_or_fetch --- R/parse.R | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/R/parse.R b/R/parse.R index 8ab01be..553ef51 100644 --- a/R/parse.R +++ b/R/parse.R @@ -272,6 +272,10 @@ read_from_csv <- function(path="inst/csv/") { res } +#' @param path directory of csv files to read +#' read data from csv files if they exist already +#' otherwise fetch protocols and then write the data into csv files +#' #' @export read_from_csv_or_fetch <- function(path="inst/") { path <- make_directory_path(path) From 1f68306fbdf15e1920dfaff1d3233d50920311fa Mon Sep 17 00:00:00 2001 From: Leon Burgard Date: Wed, 11 Aug 2021 16:42:07 +0200 Subject: [PATCH 4/7] update abschlussbericht --- inst/reports/abschlussbericht.tex | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/inst/reports/abschlussbericht.tex b/inst/reports/abschlussbericht.tex index 0b85b00..931c001 100644 --- a/inst/reports/abschlussbericht.tex +++ b/inst/reports/abschlussbericht.tex @@ -2,15 +2,20 @@ \usepackage[top=2.5cm, bottom=2.5cm]{geometry} \begin{document} + \title*{Abschlussbericht} \section*{Projektbeschreibung} - Wir haben zunächst die Plenarprotokolle der 19. Wahlperiode von der Website automatisiert herunterladen lassen. - Als nächstes haben wir die Daten in ein für die Analyse sinnvolles Format gebracht, d.h. 5 Tibbles und Fehler ausgebessert. - Daraufhin konnten wir mit der Analyse beginnen. - Insbesondere - \section*{Werkzeuge aus der Vorlesung} - Wir haben, da es hauptsächlich um Datenanalyse ging, sehr viel mit tidyverse gearbeitet. - Ganz zu Beginn haben wir fürs fetchen der Protokolle rvest verwendet. - Für die Visualisierung haben wir ggplot2 sowie vignettes genutzt. + Unser Projekt "Plenarprotokolle" stellt mittels dem Paket "hateimparlament" Funktionen zur Analyse der Plenarprotokolle der 19. Wahlperiode des deutschen Bundestages zur Verfügung. Diese Funktionen können in vier Bereiche unterteilt werden: + 1. Herunterladen der Protokolle + 2. Konvertierung der XML-Dateien in Tibbles + 3. Reparieren von Fehlern + 4. Analyse + Das Herunterladen der Protokolle gelingt über die Funktion fetch_all(), welche auf die Website des deutschen Bundestages zugreift und die XML-Dateien einzeln herunterlädt. Hierzu haben wir das Paket rvest verwendet, welches wir bereits in der Vorlesung kennengelernt haben. + Durch read_all() werden diese heruntergeladenen XML-Dateien in eine benannte Liste mit fünf Tibbles (speaker, speeches, talks, comments und applause) geschrieben. Allerdings benötigt man diese Tibbles immer wieder und es ist ziemlich zeitaufwändig die XML-Dateien immer wieder neu in Tibbles einzulesen, deshalb haben wir zusätzlich eine Funkion write_to_csv() geschrieben, die die fertigen Tibbles als CSV-Dateien speichert. Diese können dann sehr schnell durch read_from_csv() eingelesen werden, wodurch viel Zeit gesparrt wird. + Da diese Protokolle kleine Fehler enthalten, müssen diese noch im nächsten Schritt bereinigt werden, was mit repair() funktioniert. Hierbei wird das Paket tidyverse viel benutzt, welches insgesamt sehr viel in unserem Projekt beansprucht wird, da wir uns mit der Datenanalyse beschäftigen. + In analyse.R stellen wir noch einige Hilfsfunktionen bereit, die es dem Nutzer vereinfachen die Daten auszuwerten. Beispielsweise steht schon eine Funktion zur Verfügung, die ein Balkendiagramm erstellt, bei dem jede Partei des Bundestages sperat ausgewertet wird. Hierbei wird das Paket ggplot2 verwendet. + Im letzten Schritt unseres Projekts haben wir Fragestellungen festgelegt, die wir mithilfe von unserem Paket beantworten wollten. Die Daten und unsere Ergebnisse visualisierten wir mithilfe von ggplot2 und tidyverse in Vignetten. \section*{Organisation des Teams} + Während der ersten Projektphase wurden hauptsächlich die Funktionen zum Herunterladen der Dateien und Konvertieren und Reparieren der Tibbles geschrieben. Dies geschah größtenteils in Einzelarbeit, wobei hierbei die gegenseitige Kontrolle und Nachfragen die Funktionen optimiert haben. Zwischendurch wurde immer mal wieder zu einer HeiConf-Konferenz einberufen, um sich selbst den Zwischenstand klar zu machen und die Herausforderungen für die nächsten Wochen zu besprechen. + In der zweiten Hälfte des Projekts kümmerten wir uns dann um die Analyse der Daten und stellten unsere Ergebnisse in Vignetten da und erzeugten Dokumentationen für alle Funktionen, die für den Nutzer wichtig sind. \section*{Meine Beteiligung} \end{document} \ No newline at end of file From 534b34d02eaf3aa32a839267cb892e56b858cba6 Mon Sep 17 00:00:00 2001 From: JosuaKugler Date: Wed, 11 Aug 2021 16:48:31 +0200 Subject: [PATCH 5/7] improve abschlussbericht --- inst/reports/abschlussbericht.pdf | Bin 30822 -> 35894 bytes inst/reports/abschlussbericht.tex | 19 ++++++++++++++++--- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/inst/reports/abschlussbericht.pdf b/inst/reports/abschlussbericht.pdf index 6c2804cc92ab27eb2f93b6419f0db9dd2cd08042..34c8d51f1fece1f228ee5b7b25efca5d3cf291a3 100644 GIT binary patch delta 23863 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 Date: Wed, 11 Aug 2021 17:11:56 +0200 Subject: [PATCH 6/7] add meine beteiligung as input --- inst/reports/abschlussbericht.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inst/reports/abschlussbericht.tex b/inst/reports/abschlussbericht.tex index 97515c4..4426401 100644 --- a/inst/reports/abschlussbericht.tex +++ b/inst/reports/abschlussbericht.tex @@ -24,5 +24,5 @@ In der zweiten Hälfte des Projekts kümmerten wir uns dann um die Analyse der Daten und stellten unsere Ergebnisse in Vignetten da und erzeugten Dokumentationen für alle Funktionen, die für den Nutzer wichtig sind. \newpage \section*{Meine Beteiligung} - + \input{meine_beteiligung.tex} \end{document} \ No newline at end of file From 1e9c9ba6518656c3224040fac4811a48cd015610 Mon Sep 17 00:00:00 2001 From: flavis Date: Wed, 11 Aug 2021 23:29:37 +0200 Subject: [PATCH 7/7] fix documentation and improve readme --- R/parse.R | 7 ++++--- README.md | 29 ++++++++++++++++++++++++++++- man/read_from_csv_or_fetch.Rd | 15 +++++++++++++++ 3 files changed, 47 insertions(+), 4 deletions(-) create mode 100644 man/read_from_csv_or_fetch.Rd diff --git a/R/parse.R b/R/parse.R index 553ef51..e5e18a0 100644 --- a/R/parse.R +++ b/R/parse.R @@ -272,9 +272,10 @@ read_from_csv <- function(path="inst/csv/") { res } -#' @param path directory of csv files to read -#' read data from csv files if they exist already -#' otherwise fetch protocols and then write the data into csv files +#' Read records from csv or fetch +#' +#' @param path base directory where csv files are expected under path/csv +#' and possibly records fetched and stored under path/records #' #' @export read_from_csv_or_fetch <- function(path="inst/") { diff --git a/README.md b/README.md index 69de28d..01ad364 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,34 @@ Using the `remotes` package, this is easily installed via: ```r remotes::install_url("https://git.flavigny.de/christian/hateimparlament/archive/master.zip") ``` -If you want to build the vignettes, pass `build_vignettes = TRUE`. +If you want to build the vignettes, pass `build_vignettes = TRUE`. This takes a long time and +fails sometimes, if bundestag.de times out, since +in the beginning the necessary records are neither fetched nor parsed. + +## Install with vignettes + +An alternative for building +the vignettes is to clone the repository and build the vignettes manually, e.g. on Linux +``` +git clone https://git.flavigny.de/christian/hateimparlament +cd hateimparlament +``` +Then open a `R` shell and do +``` +devtools::load_all() # load package +devtools::wd() # set working directory +``` +Then fetch all records, read them and write the parsed tibbles to csv files. +``` +fetch_all(create = TRUE) +read_all() %>% repair() -> res +write_to_csv(create = TRUE) +``` +Now you can build the vignettes faster by using +``` +devtools::install(build_vignettes = T) +``` +This creates a `doc/` directory with all built vignettes. # Features diff --git a/man/read_from_csv_or_fetch.Rd b/man/read_from_csv_or_fetch.Rd new file mode 100644 index 0000000..eaeb93f --- /dev/null +++ b/man/read_from_csv_or_fetch.Rd @@ -0,0 +1,15 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/parse.R +\name{read_from_csv_or_fetch} +\alias{read_from_csv_or_fetch} +\title{Read records from csv or fetch} +\usage{ +read_from_csv_or_fetch(path = "inst/") +} +\arguments{ +\item{path}{base directory where csv files are expected under path/csv +and possibly records fetched and stored under path/records} +} +\description{ +Read records from csv or fetch +}