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:
<- function(name){
greet_someone 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:
<- function(name){
greet_someone if(name == 'Justus'){
<- '! How extraordinarily nice to see you! I hope you are doing well!'
text else{
}<- '! Nice to see you!'
text
}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:
<- function(name){
greet_someone <- '! Nice to see you!'
text
if(name == 'Justus'){
<- '! How extraordinarily nice to see you! I hope you are doing well!'
text
}
return(paste0('Hello ',name,text))
}
Aufgabe
- Erweitere die
my_var
-Funktion um ein optionalescorrected
Argument, das standardmäßig aufTRUE
gesetzt ist. Die Funktion soll, wenn dieses Argument aufTRUE
gesetzt ist, die korrigierte(\(s^2 = {1\over{n-1}} \sum_{i=1}^n(x_i -M_X)^2\)); wenn es aufFALSE
gesetzt wird die unkorrigierte (\(S^2 = {1\over{n}} \sum_{i=1}^n(x_i -M_X)^2\)) Stichprobenvarianz ausgeben.
Antworten
1.
<- function(x, corrected=TRUE){
my_var <- my_mean(x)
m_x
<- (x - m_x)^2
x
<- 1 / (length(x) - 1)
factor
if(!corrected){
<- 1 / (length(x))
factor
}
return(factor * sum(x))
}
Nicht, dass er uns verklagt.↩︎