Werken met R bij wiskunde: Controlestructuren
Voorwaardelijke instructie
In onderstaande interactieve R sessie staat eerst een waarschuwing omdat de sqrt
functie alleen binnen de niet-negatieve reële getallen rekent.
> sqrt(-3)
[1] NaN
Warning message:
In sqrt(-3) : NaNs produced
Als je zonder zorgen vierkantwortels wilt uit kunnen rekenen moet je dus onderscheid kunnen maken tussen negatieve en niet-negatieve getallen. Je kunt hiervoor een voorwaardelijke instructie via if
gebruiken:
Onderstaand R script
x <- -3
if (x<0) {
cat("Er bestaat geen reële wortel van", x)
} else {
cat("sqrt(",x,") =", sqrt(x))
}
levert bij uitvoeren van de instructies de volgende tekst op
Er bestaat geen reële wortel van -3
De algemene vorm van een voorwaardelijke instructie (if instructie) staat hieronder. Lees de toelichting voor meer uitleg:
Voorwaardelijke instructie
if (voorwaarde) {
ingesprongen instructies indien aan de voorwaarde voldaan is
} else {
ingesprongen instructies indien aan de voorwaarde niet voldaan is
}
In ons eerste voorbeeld hebben we een variabele een waarde gegeven die afhing van een conditie. Dit komt zo vaak voor dat er ook een inline voorwaardelijke instructie ifelse
mogelijk is in R. We hadden in het eerste voorbeeld ook de volgende R instructie kunnen gebruiken:
> wortel <- ifelse(x<0, "geen getal", sqrt(x))
We geven nog een voorbeeldsessie in R van de twee soorten van voorwaardelijke opdrachten, waarbij de berekening afhangt van het even of oneven zijn van een geheel getal. De voorwaardelijke instructie is over meerdere regels verspreid en de plustekens geven aan dat de instructie nog niet compleet is.
> x <- 5
> if (x %% 2 == 0) {
+ x <- x %/% 2
+ } else {
+ x <- 3*x + 1
+ }
> x
[1] 16
> x <- ifelse(x %% 2 == 0, x %/% 2, 3*x + 1)
> x
[1] 8
Tot slot geven we nog wat voorbeelden van geketende en geneste voorwaardelijke instructies. Bekijk ze goed, probeer ze te begrijpen en lees de toelichtingen bij de voorbeelden.
Als je het volgende R script uitvoert
getallen_NL <- c("een", "twee", "drie")
keuze <- sample(getallen_NL, 1)
cat(keuze, "\n")
if (keuze == "een") {
cat("one\n")
} else if (keuze == "twee") {
cat("two\n")
} else if (keuze == "drie") {
cat("three\n")
} else {
cat("???\n")
}
switch(keuze,
"een" = cat("one\n"),
"twee" = cat("two\n"),
"drie" = cat("three\n")
)
kan dit de volgende uitvoer opleveren (afhankelijk van de daadwerkelijk gemaakte keuze):
drie
three
three
Lees bij onderstaand voorbeeld de toelichting voor informatie over de opmaak van afgedrukte getallen.
Als je het volgende R script uitvoert
r <- runif(1) # een random getal tussen 0 en 1
io <- sprintf("r = %.2f\n", r) # geformatteerde tekst
cat(io)
if (0.25<r) {
if (r<0.75) {
io <- sprintf("%.2f is een getal tussen 0.25 en 0.75\n", r)
}
}
cat(io)
kan dit de volgende uitvoer opleveren:
r = 0.39
0.39 is een getal tussen 0.25 en 0.75
0.39 is een getal tussen 0.25 en 0.75