From 7a2327aba313d65d5c17b30f1ff4abd4dab32ab2 Mon Sep 17 00:00:00 2001 From: nwickel Date: Fri, 5 Jul 2024 10:49:14 +0200 Subject: [PATCH] Slides for fifth session --- 05_clean_coding/05_clean_coding.tex | 503 ++++++++++++++++++ ...or Methodenseminar SS 2024 - Session 5.png | Bin 0 -> 5838 bytes literature/lit.bib | 38 +- 3 files changed, 529 insertions(+), 12 deletions(-) create mode 100644 05_clean_coding/05_clean_coding.tex create mode 100644 figures/QR Code for Methodenseminar SS 2024 - Session 5.png diff --git a/05_clean_coding/05_clean_coding.tex b/05_clean_coding/05_clean_coding.tex new file mode 100644 index 0000000..c4e585e --- /dev/null +++ b/05_clean_coding/05_clean_coding.tex @@ -0,0 +1,503 @@ +\documentclass[aspectratio=169]{beamer} + +\usepackage{listings} +%\usepackage[utf8]{inputenc} +\usepackage[style = apa, backend = biber, natbib = true]{biblatex} +\addbibresource{../literature/lit.bib} + +\usepackage{fancyvrb} +\usepackage{fontawesome5} % get icons +\usepackage{multirow} +\usepackage{color, colortbl} + +\usepackage{tikz} +\usetikzlibrary{fit} +\usepackage[edges]{forest} + +\lstset{language = R,% + basicstyle = \ttfamily\color{iwmgray}, + frame = single, + rulecolor = \color{iwmgray}, + commentstyle = \slshape\color{iwmgreen}, + keywordstyle = \bfseries\color{iwmgray}, + identifierstyle = \color{iwmpurple}, + stringstyle = \color{iwmblue}, + numbers = none,%left,numberstyle = \tiny, + basewidth = {.5em, .4em}, + showstringspaces = false, + emphstyle = \color{red!50!white}} + +\makeatletter \def\newblock{\beamer@newblock} \makeatother + +\beamertemplatenavigationsymbolsempty +\setbeamertemplate{itemize items}[circle] +\setbeamertemplate{section in toc}[circle] +\mode{\setbeamercolor{math text displayed}{fg=iwmgray}} +\setbeamercolor{block body}{bg=iwmorange!50!white} +\setbeamercolor{block title}{fg=white, bg=iwmorange} +% Definitions for biblatex +\setbeamercolor{bibliography entry note}{fg=iwmgray} +\setbeamercolor{bibliography entry author}{fg=iwmgray} +\setbeamertemplate{bibliography item}{} + +\definecolor{iwmorange}{RGB}{255,105,0} +\definecolor{iwmgray}{RGB}{67,79,79} +\definecolor{iwmblue}{RGB}{60,180,220} +\definecolor{iwmgreen}{RGB}{145,200,110} +\definecolor{iwmpurple}{RGB}{120,0,75} + +\setbeamercolor{title}{fg=iwmorange} +\setbeamercolor{frametitle}{fg=iwmorange} +\setbeamercolor{structure}{fg=iwmorange} +\setbeamercolor{normal text}{fg=iwmgray} +\setbeamercolor{author}{fg=iwmgray} +\setbeamercolor{date}{fg=iwmgray} + +\newcommand{\vect}[1]{\mathbf{#1}} +\newcommand{\mat}[1]{\mathbf{#1}} +\newcommand{\gvect}[1]{\boldsymbol{#1}} +\newcommand{\gmat}[1]{\boldsymbol{#1}} + +\AtBeginSection[]{ + \frame{ + \tableofcontents[sectionstyle=show/hide, subsectionstyle=show/show/hide]}} + +\setbeamertemplate{headline}{ + \begin{beamercolorbox}{section in head} + \vskip5pt\insertsectionnavigationhorizontal{\paperwidth}{}{}\vskip2pt + \end{beamercolorbox} +} + +\setbeamertemplate{footline}{\vskip-2pt\hfill\insertframenumber$\;$\vskip2pt} + +\title{Clean coding} +\author{Nora Wickelmaier} +\date{July 8, 2024} + +\begin{document} + +\begin{frame}{} +\thispagestyle{empty} +\titlepage +\end{frame} + +\begin{frame}{What is needed to make code reproducible?} + % slido + \centering + \includegraphics[width = 5cm]{../figures/QR Code for Methodenseminar SS 2024 - Session 5} + + \url{https://app.sli.do/event/uEz8fJWkLBNm1sthQovXNH} +\end{frame} + +\begin{frame}[fragile]{Programming resources} + \footnotesize + \begin{tabular}{ll} + Learning statistics with R & {\url{https://learningstatisticswithr.com/book/}} \\ + &\\ + R for Data Science & {\url{https://r4ds.hadley.nz/}} \\ + &\\ + Advanced R & {\url{https://adv-r.hadley.nz/}} \\ + &\\ + Happy Git and GitHub for the useR & {\url{https://happygitwithr.com/}} \\ + &\\ + R Programming for Research & {\url{https://geanders.github.io/RProgrammingForResearch/}} \\ + &\\ + Building reproducible analytical pipelines with R & {\url{https://raps-with-r.dev/}} \\ + &\\ + Data Skills for Reproducible Science & {\url{https://psyteachr.github.io/msc-data-skills/}} \\ + \end{tabular} +\end{frame} + +\begin{frame}{Agenda} +\centering +\begin{tabular}{ll} +\hline +Date & Topic \\ +\hline +2024-05-13 & Introduction to data management \\ +2024-05-27 & Workflow \\ +2024-06-10 & Data organisation\\ +2024-06-24 & Data sharing \\ +\only<1>{2024-07-08}\only<2>{\bf 2024-07-08} & +\only<1>{Clean coding}\only<2>{\bf Clean coding} \\ +2024-07-22 & Version control \\ +\hline +\end{tabular} +\end{frame} + +% Understandable coding +% Cleaning up R code for readability +% Documentation of a final R script +% Reproducible code + +\section{Style guidelines} + +\begin{frame}[<+->]{Style guidelines in R} + \begin{itemize} + \item R has no mandatory or commonly accepted style guide + \item However, Hadley Wickham and Google developed style guides which are + now widely accepted + \begin{itemize} + \item \url{https://google.github.io/styleguide/Rguide.html} + \item \url{https://style.tidyverse.org/} + \end{itemize} + \item It is always a good idea to follow a style guide and not ``create'' + your own rules (if you deviate, be consistent!) + \item A style guide helps with + \begin{itemize} + \item Keeping code clean which is easier to read and interpret + \item Making it easier to catch and fix mistakes + \item Making it easier for others to follow and adapt your code + \item Preventing possible problems, e.\,g., avoiding dots in function + names + \end{itemize} + \end{itemize} + \nocite{Wickham_styleguide, Anderson2023} +\end{frame} + +\begin{frame}[fragile, allowframebreaks]{File names} + \begin{itemize} + \item File names should be meaningful and end in .R + \item Avoid using special characters in file names + \item Stick with numbers, letters, \verb+-+, and \verb+_+ + \begin{lstlisting}[identifierstyle = \bfseries\color{iwmgray}] +# Good +fit_models.R +utility_functions.R + +# Bad +fit models.R +foo.r +stuff.r + \end{lstlisting} + \framebreak + + \item If files should be run in a particular order, prefix them with numbers + \item If it seems likely you’ll have more than 10 files, left pad with zero + \begin{lstlisting}[identifierstyle = \bfseries\color{iwmgray}] +00_download.R +01_explore.R +... +09_model.R +10_visualize.R + \end{lstlisting} + \item If you later realize that you missed some steps, it’s tempting to use + 02a, 02b, etc. + \item However, it is generally better to bite the bullet and rename all + files + \end{itemize} +\end{frame} + +\begin{frame}[fragile, allowframebreaks]{Object names} + \begin{itemize} + \item Variable and function names should use only lowercase letters, + numbers, and \verb+_+ + \item Use underscores (\verb+_+) (so called snake case) to separate words + within a name + \begin{lstlisting}[identifierstyle = \bfseries\color{iwmgray}] +# Good +day_one +day_1 + +# Bad +DayOne +dayone + \end{lstlisting} + \framebreak + + \item Generally, variable names should be nouns and function names should be + verbs + \item Strive for names that are concise and meaningful + \begin{lstlisting}[identifierstyle = \bfseries\color{iwmgray}] +# Good +day_one + +# Bad +first_day_of_the_month +djm1 + \end{lstlisting} + \framebreak + + \item Avoid re-using names of common functions and variables + \begin{lstlisting} +# Bad +T <- FALSE +c <- 10 +mean <- function(x) sum(x) + \end{lstlisting} + \end{itemize} +\end{frame} + +\begin{frame}[fragile, allowframebreaks]{Spacing} + \begin{itemize} + \item Always put a space after a comma, never before + \begin{lstlisting} +# Good +x[, 1] + +# Bad +x[,1] +x[ ,1] +x[ , 1] + \end{lstlisting} + \framebreak + + \item Do not put spaces inside or outside parentheses for regular function + calls + \begin{lstlisting} +# Good +mean(x, na.rm = TRUE) + +# Bad +mean (x, na.rm = TRUE) +mean( x, na.rm = TRUE ) + \end{lstlisting} + \framebreak + +\item Place a space before and after \texttt{()} when used with \texttt{if}, + \texttt{for}, or \texttt{while} + \begin{lstlisting} +# Good +if (debug) { + show(x) +} + +# Bad +if(debug){ + show(x) +} + \end{lstlisting} + \framebreak + +\item Place a space after \texttt{()} used for function arguments + \begin{lstlisting} +# Good +function(x) {} + +# Bad +function (x) {} +function(x){} + \end{lstlisting} + \framebreak + + \item Most infix operators (\verb+==+, \verb|+|, \verb+-+, \verb+<-+, etc.) + should always be surrounded by spaces + \begin{lstlisting} +# Good +height <- (feet * 12) + inches +mean(x, na.rm = TRUE) + +# Bad +height<-feet*12+inches +mean(x, na.rm=TRUE) + \end{lstlisting} + \framebreak + + \item There are a few exceptions, which should never be surrounded by + spaces: \verb+::+, \verb+:::+, \verb+$+, \verb+@+, \verb+[+, \verb+[[+, + \verb+?+, \verb+^+, and \verb+:+ + {\small + \begin{lstlisting} +# Good +sqrt(x^2 + y^2) +df$z +x <- 1:10 +package?stats +?mean + +# Bad +sqrt(x ^ 2 + y ^ 2) +df $ z +x <- 1 : 10 +package ? stats +? mean + \end{lstlisting} + } + \item Adding extra spaces is ok if it improves alignment of \verb+=+ or + \verb+<-+ + \begin{lstlisting} +# Good +list( + total = a + b + c, + mean = (a + b + c) / n +) + +# Also fine +list( + total = a + b + c, + mean = (a + b + c) / n +) + \end{lstlisting} + \end{itemize} +\end{frame} + +% CITE: +% https://style.tidyverse.org/index.html +% R Programming for Reserach: https://geanders.github.io/RProgrammingForResearch/ +% Building reproducible analytical pipelines with R: https://raps-with-r.dev/ + +\section{Script organisation} + +\begin{frame}[fragile]{Script header} + \begin{itemize} + \item It can be very helpful to have some general information right at the + top when opening a script + \begin{lstlisting} +# 01_preprocessing.R +# +# Cleaning up toy data set (Methods Seminar SS2024) +# +# Input: rawdata/RDM_MS_SS2024_download_2024-06-07.csv +# Output: processed/data_rdm-ms-ss2024_cleaned.csv +# processed/data_rdm-ms-ss2024_cleaned.RData +# +# Created: 2024-06-03, NW + \end{lstlisting} + \item These metadata help you remember faster what you did + \item Might not be necessary when using consistent version control (but does + not hurt either) + \end{itemize} +\end{frame} + +\begin{frame}[fragile]{Line length} + {} + \begin{center} + {\Large\bf Keep lines to 80 characters or less!} + \end{center} + \begin{lstlisting} +# Good +my_df <- data.frame(n = 1:3, + letter = c("a", "b", "c"), + cap_letter = c("A", "B", "C")) + +# Bad +my_df <- data.frame(n = 1:3, letter = c("a", "b", "c"), cap_letter = c("A", "B", "C")) + \end{lstlisting} + \begin{itemize} + \item Ensures that your code is formatted in a way that you can see all of + the code without scrolling horizontally + \item To set your script pane to be limited to 80 characters, go to\\ + \verb+RStudio -> Preferences -> Code -> Display+\\ + and set ``Margin Column'' to 80 + \end{itemize} +\end{frame} + +\begin{frame}[fragile, allowframebreaks]{File organisation} + \begin{itemize} + \item Try to write scripts that are concerned with one (major) task + \item If you can find a name, that captures the content, it is usually a + good way to start + \item Some (random) examples +\begin{lstlisting}[identifierstyle = \bfseries\color{iwmgray}] +download-data.R +data-cleaning.R +cluster_analysis_exp1.R +visualization_logistic-model.R +anova_h1.R + \end{lstlisting} + \framebreak + + \item Export data sets for new scripts (do not make yourself run all scripts + up to script 5 each time, just because you need the data in a certain + format) + \begin{lstlisting} +# Interoperable +write.table(dat, + file = "data_exp1_cleaned.csv", + sep = ";", + quote = FALSE, + row.names = FALSE) + +# Preserve order of factor levels, date formats, etc. +save(dat, file = "data_exp1_cleaned.RData") + \end{lstlisting} + \end{itemize} +\end{frame} + +\begin{frame}[fragile, allowframebreaks]{Internal structure} + \begin{itemize} + \item Use commented lines with \texttt{-} or \texttt{=} to break your file + up into chunks + \item Load additional packages at the beginning of the script + \begin{lstlisting} +library(lme4) +library(sjPlot) + +# Load data --------------------------- + +# Plot data --------------------------- + \end{lstlisting} + \framebreak + + \item If you load several packages, be aware that the order of loading + matters! + \item If you use only one or two functions from a package, get the function + with \verb+::+ instead of loading the whole package + \begin{lstlisting} +library(lme4) +... + +# Fit mixed-effects model to test Hypothesis 1 +lme1 <- lmer(Reaction ~ Days + (Days | Subject), sleepstudy) +summary(lme1) +sjPlot::tab_model(lme1) + \end{lstlisting} + \framebreak + + \item Group related pieces of code together + \item Separate blocks of code by empty spaces + \begin{lstlisting} +# Load data +library(faraway) +data(nepali) + +# Relabel sex variable +nepali$sex <- factor(nepali$sex, + levels = c(1, 2), + labels = c("Male", "Female")) + \end{lstlisting} + \end{itemize} +\end{frame} + + + +\begin{frame}{How can I test if my code is reproducible?} + % slido + \centering + \includegraphics[width = 5cm]{../figures/QR Code for Methodenseminar SS 2024 - Session 5} + + \url{https://app.sli.do/event/uEz8fJWkLBNm1sthQovXNH} +\end{frame} + +\section{Code reviews} + +\begin{frame}[<+->]{Use your peers} + \begin{itemize} + \item Do not overthink it! + \item Just give your data and code to a colleague and ask them to reproduce + what you did (this sounds easy, but it is actually not!) + \item This will give you tons of insights about your workflow + \begin{itemize} + \item Can this person (in general) understand what you did? + \item Is this person able to easily put your data on their machine and + run the code right away? + \item Anything this person would have done differently? + \item Discuss why and which things you do differently + \end{itemize} + \item Reading other peoples's code is the best way to learn about how things + can be done differently than you do them + \item You can review code by printing it out and adding comments by hand\\ + (I highly recommend this!) + \end{itemize} +\end{frame} + +\appendix +%\begin{frame}[allowframebreaks]{References} +\begin{frame}{References} +%\renewcommand{\bibfont}{\small} + \printbibliography +\vfill +\end{frame} + +\end{document} + diff --git a/figures/QR Code for Methodenseminar SS 2024 - Session 5.png b/figures/QR Code for Methodenseminar SS 2024 - Session 5.png new file mode 100644 index 0000000000000000000000000000000000000000..0060507800bb9970eff20147c8bcb71aaf71226b GIT binary patch literal 5838 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 literal 0 HcmV?d00001 diff --git a/literature/lit.bib b/literature/lit.bib index 557f5e0..7335aa3 100644 --- a/literature/lit.bib +++ b/literature/lit.bib @@ -1,3 +1,11 @@ +@book{Anderson2023, + title = {R programming for research}, + author = {Brooke Anderson and Rachel Severson and Nicholas Good}, + year = {2023}, + publisher = {Colorado State University, ERHS 535}, + url = {https://geanders.github.io/RProgrammingForResearch/} +} + @article{Kathawalla2021, title = {Easing into open science: {A} guide for graduate students and their advisors}, author = {Kathawalla, Ummul-Kiram and Silverstein, Priya and Syed, Moin}, @@ -9,11 +17,11 @@ } @book{Koeller2004, - title = {Wege zur {H}ochschulreife in {B}aden-{W}{\"u}rttemberg: {TOSCA} -- {E}ine {U}ntersuchung an allgemein bildenden und beruflichen {G}ymnasien}, - author = {K{\"o}ller, Olaf and Watermann, Ralf and Trautwein, Ulrich and L{\"u}dtke, Oliver}, - year = {2004}, + title = {Wege zur {H}ochschulreife in {B}aden-{W}{\"u}rttemberg: {TOSCA} -- {E}ine {U}ntersuchung an allgemein bildenden und beruflichen {G}ymnasien}, + author = {K{\"o}ller, Olaf and Watermann, Ralf and Trautwein, Ulrich and L{\"u}dtke, Oliver}, + year = {2004}, publisher = {Springer}, - doi = {10.1007/978-3-322-80906-3} + doi = {10.1007/978-3-322-80906-3} } @article{Lowndes2017, @@ -51,14 +59,20 @@ } @article{Wicherts2012, - title = {Publish (your data) or (let the data) perish! {W}hy not publish your data too?}, - author = {Wicherts, Jelte M and Bakker, Marjan}, - journal = {Intelligence}, - volume = {40}, - number = {2}, - pages = {73--76}, - year = {2012}, - doi = {10.1016/j.intell.2012.01.004} + title = {Publish (your data) or (let the data) perish! {W}hy not publish your data too?}, + author = {Wicherts, Jelte M and Bakker, Marjan}, + journal = {Intelligence}, + volume = {40}, + number = {2}, + pages = {73--76}, + year = {2012}, + doi = {10.1016/j.intell.2012.01.004} +} + +@misc{Wickham_styleguide, + author = {Hadley Wickham}, + title = {The tidyverse style guide}, + url = {https://style.tidyverse.org/} } @misc{Wilbrandt2023,