Inleiding Programmeren + R

Functies

» Start

Functies


Een van de grote voordelen van R is het beschikbaar zijn van een zeer groot aantal functies. Dat zijn kant en klare programma's die in R gebruikt kunnen worden voor het verrichten van allerlei taken en berekeningen. Er zijn bijvoorbeeld functies voor het uitvoeren van wiskundige berekeningen en statistische toetsen.  Dat kunnen heel eenvoudige functies zijn zoals bijvoorbeeld het uitrekenen van de variantie van een steekproef, maar ook veel ingewikkelder zoals die voor het uitvoeren van multivariate analyses.


Functies worden in R afhankelijk van de taken die ze kunnen uitvoeren gebundeld tot zg pakketten (packages). Zo zijn alle functies die nuttig en nodig zijn voor het doen van allerlei statistische analyses gebundeld in het pakket stats. Dat zijn er 494, en dus een beetje veel om hier de revue te laten passeren. En in het base pakket dat bij iedere start van R automatisch wordt geladen zitten 1046 functies!

> ls("package:base")

Dan blijkt dat bijvoorbeeld ook het symbool-paar '<-' een functie is!


Functies lijken erg op scripts. Net als scripts bestaan functies uit een serie R opdrachten. Maar het grote verschil tussen functies en scripts is dat je bij het aanroepen van een functie een variabele mee kunt geven waarmee de functie moet werken, dus zo:

functie(naam_van_variabele)

De waarde van de variabele noemen we een parameter voor de functie. De variabele zelf is het argument van de functie. De functie heeft in dit voorbeeld zogezegd dus 1 argument, nl die ene variabele. 

mean(x)

en 

length(x)

zijn voorbeelden van een R-functies die 1 argument nodig hebben, nl een vector. In dit voorbeeld heeft de vector de naam x. 


Andere functies hebben meerdere argumenten nodig bij hun aanroep. Dit is dan de algemene vorm:

> functienaam(arg1,arg2,. . . )

De ronde haakjes zijn verplicht, zelfs als de functie geen argumenten behoeft. Zonder de 

haakjes reageert R met het listen van de definitie van de functie. 

> functienaam() # voer de functie functienaam uit (zonder argumenten)

> functienaam # list de definitie van de functie functienaam

Een ander belangrijk verschil tussen functies en scripts zit'm in het bereik, de zg scope, van de variabelen die in een functie of script worden gemaakt. 


In een script zijn alle variabelen globaal. Dat wil zeggen dat een script alle variabelen kan zien [en er dus ook mee kan werken] die in het geheugen van R aanwezig zijn, en ook dat na afloop van het script alle variabelen die in het script zijn gedefinieerd in het geheugen van R beschikbaar zijn gekomen.  De scope van in een script gedefinieerde variabelen is dus heel breed - breder kan in feite niet.


In een functie daarentegen hebben alle variabelen die in de functie worden gedefinieerd een lokaal karakter. Als een functie eenmaal werkt dan ziet hij niet meer de variabelen die in het geheugen van R aanwezig zijn, en die je met het commando ls kunt zien. Een functie kent na zijn start alleen de inhoud van de variabelen die als argument worden meegegeven, en verder alleen die variabelen die tijdens het 'draaien' van de functie in de functie zelf worden gemaakt. Is de functie eenmaal klaar met zijn werk dan zijn ook alle interne, lokale variabelen verdwenen en niet meer toegankelijk. De scope van lokale variabelen is dus heel beperkt. 

    

    > printx <- function() {

    + botje <- 12

    + print(botje)

    + }

    

    > printx()

    [1] 12

    

    > botje

    Error: object "botje" not found

    

In het bovenstaande voorbeeld wordt in de functie printx een waarde toegekend aan een variabele met de naam botje. De inhoud van botje wordt vervolgens geprint. Daarna is de functie afgelopen. Als we vervolgens vragen naar de inhoud van botje, dan kan botje niet gevonden worden in de werkruimte. Dat klopt, want botje is een lokale variabele van de functie printx: botje bestaat alleen zolang de functie printx aan het werk is. Daarna niet meer.


Je kunt zorgen dat lokale variabelen toch globaal beschikbaar komen. Dat gebeurt met variabelen die nadrukkelijk als output van de functie worden gedefinieerd. Dergelijke output variabelen zorgen ervoor dat je het resultaat van de functie toe kunt kennen aan een variabele, dus zo:

    

    output <- functie(argument)

    

>> Functie definitie