if-Statements

Als letzten Schritt wollen wir besonders höflich zu speziellen Nutzern sein. So soll der Name ‘Justus’1 ausschweifender gegrüßt werden, als alle anderen Namen.

Um das umsetzten zu können, müssen wir irgendwie einen Test einfügen, ob der gegebene Name gleich ‘Justus’ ist.

Dafür können wir ein so genanntes if...else-Statement nutzen. Die erste Hälfte, das if-Statement ermöglicht es uns, besonderes Verhalten auszulösen, wenn eine logische Bedingung erfüllt ist. Das else danach können wir nutzen um jeden anderen Fall zu definieren:

greet_someone <- function(name){
  if(name == 'Justus'){
    return(paste0('Hello ',name,'! How extraordinarily nice to see you! I hope you are doing well!'))
  }else{
    return(paste0('Hello ',name,'! Nice to see you!'))
  }
}

Das funktioniert zwar:

greet_someone('Justus')
## [1] "Hello Justus! How extraordinarily nice to see you! I hope you are doing well!"
greet_someone('Jonas')
## [1] "Hello Jonas! Nice to see you!"

Und bemerkensweiterweise auch in der geschachtelten Form:

greet_someone_n_times('Justus')
## [1] "Hello Justus! How extraordinarily nice to see you! I hope you are doing well!"
## [2] "Hello Justus! How extraordinarily nice to see you! I hope you are doing well!"
## [3] "Hello Justus! How extraordinarily nice to see you! I hope you are doing well!"

Aber wirklich gut lesbar ist das nicht unbedingt. Ein gängiger Ansatz, um die Lesbarkeit einer solchen Funktion mit verschiedenen Outputs zu verbessern, ist, nur ein return-statement ans Ende der Funktion zu stellen und die Teil-Änderung durch das if-statement in einem Objekt abzulegen, das im gemeinsamen return genutzt wird. So könnten wir den letzten Teil des Grußes zum Beispiel in einem Objekt namens text ablegen und je nach Nutzer anpassen:

greet_someone <- function(name){
  if(name == 'Justus'){
    text <- '! How extraordinarily nice to see you! I hope you are doing well!'
  }else{
    text <- '! Nice to see you!'
  }
  return(paste0('Hello ',name,text))
}

Ein letzter Trick, um diese Funktion leichter lesbar zu gestalten, ist den Regelfall vor das if-statement zu stellen und sich so das else zu sparen. Da die Anweisung im if-statement nur evaluiert wird, wenn der Test positiv aufgeht, ist das Ergebnis der folgenden Funktion äquivalent:

greet_someone <- function(name){
  text <- '! Nice to see you!'
  
  if(name == 'Justus'){
    text <- '! How extraordinarily nice to see you! I hope you are doing well!'
  }
  
  return(paste0('Hello ',name,text))
}

Aufgabe

  1. Erweitere die my_var-Funktion um ein optionales corrected Argument, das standardmäßig auf TRUE gesetzt ist. Die Funktion soll, wenn dieses Argument auf TRUE gesetzt ist, die korrigierte(\(s^2 = {1\over{n-1}} \sum_{i=1}^n(x_i -M_X)^2\)); wenn es auf FALSE gesetzt wird die unkorrigierte (\(S^2 = {1\over{n}} \sum_{i=1}^n(x_i -M_X)^2\)) Stichprobenvarianz ausgeben.
Antworten

1.

my_var <- function(x, corrected=TRUE){
  m_x <- my_mean(x)
  
  x <- (x - m_x)^2
  
  factor <- 1 / (length(x) - 1)
  
  if(!corrected){
    factor <- 1 / (length(x))
  }
  
  return(factor * sum(x))
}

  1. Nicht, dass er uns verklagt.↩︎