Inleiding Programmeren + R

Fout afhandeling

» Start

Fout afhandeling


R kent 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 getal moet zijn en niet een tekst, dan kunnen we een if-statement samen met een return-statement gebruiken om het programma direct te laten stoppen.


Bijvoorbeeld:

mijn.func <- function(input) {

if ("character" == mode(input)) { # controleer input

cat("input moet numeriek zijn...!")

return()

}

output <- 2 * input # output regel

}


Je kunt ook in dit geval ook de volgende  if-statement gebruiken:

if (is.character(input)) { # controleer input

cat("input moet numeriek zijn...!")

return()

}

Je kunt de foutboodschap ook als argument van return meegeven:

if (is.character(input)) { # controleer input

msg <- "input moet numeriek zijn...!"

return(msg)

}


Nog een voorbeeld: Je moet controleren of het eerste argument van de functie groter is dan het tweede, en het tweede groter dan nul:


    mijn.func <- function(x,y) {

        if (! (x > y & y > 0)) { # controleer input

            cat("eerste argument moet groter zijn dan het tweede, en ...\n")

            cat("het tweede argument moet groter zijn dan nul. \n")

            return()

            }

        output <- x / y # output regel

        }


Als je functie expliciete output moet leveren, bijvoorbeeld zo:

    

    > output <- mijn.func(input)

    

dan gaat dat fout bij bovenstaande voorbeelden omdat er nog helemaal niets toe te wijzen valt aan de variabele output, omdat die nog niet door de functie is berekend.  return doet de functie ogenblikkelijk stoppen, maar we kunnen tegelijkertijd zorgen dat de functie alsnog output genereert door die output als argument met return mee te geven. Bijvoorbeeld:


mijnprogramma<-function(x,y,z) { 

    # maak verstekwaarde voor output [lege vector]

    output <- NULL

    # invoer moeten getallen zijn, groter dan nul: 

    if (is.character(x) | is.character(y) | is.character(z)) {

        print("alle argumenten moeten numeriek zijn")

        return(output) # stop, en maak uitvoer expliciet

    }   

    if(x<=0 | y<=0 | z<=0) { 

        print("alle ingevoerde getallen moeten groter zijn dan 0")

        return(output) # stop, en maak uitvoer expliciet

    }

    output <- x / y * z # normale expliciete uitvoer