Inleiding Programmeren + R

Lussen

» Start

Lussen (loops)


R kent 3 functies waarmee je lussen in scripts en functies kunt programmeren. Je gebruikt een lus structuur wanneer je opdrachten een [aan voorwaarden gebonden] aantal keren wilt herhalen. Die functies zijn for, while, en repeat, ofwel de voor, de zolang, en de herhaal-lus.


Nota bene: Uit de voorgaande paragrafen (zoals vector) is duidelijk, dat R veel lus-iteraties impliciet uitvoert. Bijvoorbeeld, het commando sqrt(x) past automatisch de wortelfunctie toe op alle elementen van de vector x. Door hiervan handig gebruik te maken is het vaak mogelijk expliciete lus constructies te vermijden. Naast tot besparing van typwerk leidt dit in veel gevallen ook tot aanzienlijk sneller rekenwerk. De nu te bespreken expliciete lus constructies zijn in R relatief langzaam. 


De belangrijkste lus is de for constructie. 

> for (name in values) expr 

Het resultaat is het een voor een toekennen van de elementen van values aan name en het steeds evalueren van expr. Hierbij is values meestal een vector of een lijst. De variabele name is een dummy, die aan het eind van de for statement niet meer bestaat. 

> x <- y <- NULL # NULL is een leeg object

> for (i in 1:10) {x <- c(x,i); y <-c(y,0)} 

> x 

[1] 1 2 3 4 5 6 7 8 9 10 

> y 

[1] 0 0 0 0 0 0 0 0 0 0 

>> for-loop voorbeeld


Een alternatief is de while statement. 

> while (voorwaarde) expr 

De uitvoering begint met het testen van de voorwaarde. Als de uitkomst FALSE is, stopt de uitvoering; als de uitkomst TRUE is, dan wordt expr geĆ«valueerd en begint de uitvoering van voren af aan. 

    

    > x <- numeric(10) 

    > x 

    [1] 0 0 0 0 0 0 0 0 0 0 

    > i <- 0 

    

    > while (i < 10) {

    + i <- i+1 

    + x[i]<- i

    + } 

    

    > x 

    [1] 1 2 3 4 5 6 7 8 9 10 

    

>> while voorbeeld


De repeat constructie wordt gebruikt in samenhang met break. De algemene vorm is: 

    

    > i <- 0

    > x <- numeric(10)


    > repeat { 

    + i <- i+1

    + x[1] <- i

    + if ( i > 9) break 

    + } 

    

De opdracht break is het enige instrument wat we hebben om een repeat lus op tijd te stoppen, om zogezegd uit de lus te stappen. Een for lus en een while lus hebben van huis uit een voorwaarde die ze bij iedere stap controleren. Zodra niet meer aan de voorwaarde wordt voldaan dan stopt de for lus of de while lus. Bij de repeat lus is dat dus niet het geval. Daar moet met behulp van een voorwaardelijke opdracht (if) gekoppeld aan een break statement de mogelijkheid om uit de lus te kunnen stappen nadrukkelijk worden geprogrammeerd.


>> repeat voorbeeld

 

Nota bene: Als de break wordt vergeten waarschuwt R niet, zoals R bij het ontbreken van een conditie na de while wel zal doen (syntax error)!  Een repeat lus zonder break levert geen syntax fout op. Daar moet je zelf maar op letten!


Tussentijds stoppen


Wanneer R break evalueert, verlaat het de binnenste for, while, of repeat loop waarin break bevat is. Naast break is het ook mogelijk next te gebruiken. De next zorgt ervoor dat de volgende iteratie van de loop onmiddelijk wordt begonnen, zonder de huidige af te ronden.


Verder kent R de return functie. Die kun je gebruiken om een zelf geschreven functie/programma direct met zijn werk te laten stoppen. Een van de manieren om de return functie toe te passen is bij de controle op de kwaliteit van de input van een programma.  Als de input niet overeenkomt met de afspraak, bijvoorbeeld dat het een numerieke vector met twee elementen moet zijn, dan kunnen we een if-statement samen met een return-statement gebruiken om het programma direct te laten stoppen.


Zie Fout afhandeling.



Nota bene: voorgaande voorbeelden van for, while en repeat lussen zijn geen goed gebruik van R. Vergelijk het commando:

> x <- 1:10 

waarmee het zelfde resultaat wordt bereikt, maar dan zonder lus constructie!


zie: Impliciete lus