Afsnit R.5: Gentagne beregninger, betingede beregninger

Indholdet i dette afsnit skal ikke bruges i kurset Introducerende Statistik og Dataanalyse med R, men er medtaget for fuldstændighedens skyld.
Ofte kommer man ud for, at man ønsker at gentage et stykke kode mange gange. Dette kan gøres ved en såkaldt for-løkke. Denne starter med for og angivelse af, at en variabel skal løbe i en bestemt mængde, og derefter kommer koden omsluttet af tuborgklammer.
Følgende program finder for et givet heltal hvilke tal mellem 1 og der går op i tallet. Dette gøres ved en for-løkke med et index der løber fra 1 til og i hvert trin udregnes resten ved division af med Efter løkken angives de for hvilke resten er nul. Undervejs bruges funktionen floor, der giver det største hele tal mindre end eller lig med input til funktionen.

 > n=12;
 > divisor=c(1:n)
 > rest=rep(0,n)

 > for (j in 1:n){
 +  rest[j]=n-floor(n/j)*j
 + }

 > divisor[rest==0]
  [1]  1  2  3  4  6 12

En for-løkke er velegnet, når man på forhånd ved, hvor mange gange man skal løbe gennem løkken. Hvis man ikke ved dette, og det afgøres af de beregninger, der laves undervejs, bruges en while-løkke. Denne starter med while og et sandshedsudsagn Så længde sandshedsudsagnet er sandt, løber man gennem løkken (her skal man altså passe på ikke at lave en løkke, der aldrig stopper).
Det følgende program beregner alle fibonacci tal indtil det første af disse, der er større end eller lig med 1000.

 > fib=c(1,1)
 
 > while (fib[length(fib)]<1000){
 +  nye=fib[length(fib)]+fib[length(fib)-1]
 +  fib=c(fib,nye) # vektoren fib forlænges med et tal
 + }
 
 > fib
  [1]    1    1    2    3    5    8   13   21   34   55   89  144  233  377  610
 [16]  987 1597

En while-løkke bruger et sandshedsudsagn til at bestemme, om løkken skal fortsætte. Mere generelt kan man kontrollere, at et stykke kode udføres, alt efter om en betingelse er opfyldt ved hjælp af en if-konstruktion. En if-konstruktion er enten af typen if (betingelse){...} eller af typen if (betingelse){...} else {...}. I den første konstruktion udføres en beregning, alt efter om en betingelse er opfyldt. I den anden konstruktion udføres en beregning, hvis en betingelse er opfyldt, og en anden beregning udføres, hvis betingelsen ikke er opfyldt.
I den første del af koden nedenfor findes alle lige tal mellem 1 og 10, og i den anden del findes separat de lige og de ulige tal.

 # første del
 > lige=c()  # tom struktur
 > for (j in 1:10){
 +   rest=j-floor(j/2)*2
 +   if (rest==0){
 +    lige=c(lige,j)
 +   }
 + }
 
 > lige
  [1]  2  4  6  8 10
 
 # anden del
 > lige=c()
 > ulige=c()
 > for (j in 1:10){
 +   rest=j-floor(j/2)*2
 +   if (rest==0){
 +    lige=c(lige,j)
 +   } else {
 +    ulige=c(ulige,j)
 +   }
 + }
 
 > lige
  [1]  2  4  6  8 10

 > ulige
  [1] 1 3 5 7 9

ForegåendeNæste