Funksjoner

Hva er en funksjon?

En funksjon er en kodedel som kan brukes om og om igjen. De ligner på SAS-makroer og brukes til å automatisere prosesser. Den har en input (det som sendes inn til funksjonen) og en output (det som kommer ut).

En parameter er tilleggsinformasjon som sendes inn til funksjonen for å spesifisere videre hva funksjonen skal gjøres.

Bruk av funksjoner kan være nyttig for gjenbruk og abstraksjon.

Lage en enkel funksjon

Vi lager en funksjon ved å allokere et navn og spesifisere function():

min_func <- function(){
  print("hello")
}

Etterpå kan vi kjøre funksjonen med:

min_func()
[1] "hello"

Lage en funksjon for fylke

Her skal vi lage en funksjon som kan ta kommunenummer som input og returnere fylkenummer. Vi spesifiserer kommunenummer som en parameter i funksjonen. Vi bruker substr() for å plukke ut de første to sifferne.

lage_fylke <- function(kommunenr){
  substr(kommunenr, 1, 2)
}

lage_fylke("0301")
[1] "03"

Funksjoner kan gå over flere linjer. Den siste linjen er det som returneres. Hva som returneres kan også spesifiseres med return() ved behov, særlig nyttig i komplekse funksjoner med flere output.

Flere parameter

Funksjoner kan ta mer enn èn paramter. For eksempel i fylke-funksjonen kanskje vi ønsker å sjekke lengden for å se om ledende 0-ere har falt av.

lage_fylke <- function(kommunenr, sjekk_lengde){
  if(sjekk_lengde == TRUE){
    kommunenr <- ifelse(nchar(kommunenr) == 3, 
                        paste("0", kommunenr, sep = ""), 
                        kommunenr)
  }
  fylke <- substr(kommunenr, 1, 2)
  fylke
}
lage_fylke(kommunenr = "301", sjekk_lengde = TRUE)
[1] "03"
lage_fylke(kommunenr = "301", sjekk_lengde = FALSE)
[1] "30"

Standard/default parameter

Vi kan sette standard parameter verdier for å slippe å spesifisere hver gang. For eksemepel, samme funksjon over kan ha sjekk_lengde=TRUE som standard parameter.

lage_fylke <- function(kommunenr, sjekk_lengde = TRUE){
  if(sjekk_lengde == TRUE){
    kommunenr <- ifelse(nchar(kommunenr) == 3, 
                        paste("0", kommunenr, sep = ""), 
                        kommunenr)
  }
  fylke <- substr(kommunenr, 1, 2)
  fylke
}

lage_fylke("301")
[1] "03"

Noen ganger kalles disse for “named parameters” eller “keyword arguements”. Standard parameter kommer alltid til sist.

Globalt vs, Lokalt-miljø

Når vi lager en funksjon, lager vi et lite lokalt-miljø. Varaiabler som lagres inn i en funksjon påvirker ikke det globale miljøet og blir slettet når funksjonen er ferdigkjørt. For eksempel, om vi har en enkel funksjon som returnerer verdien av parameter x vil ikke dette påvirkes om vi har en x i det globale miljøet:

funcx <- function(x){
  x
}
x <- 2
funcx(x = 4)
[1] 4
x
[1] 2

Varsling i funksjoner

Noen ganger ønsker vi at funksjonen skal si ifra om noe er litt rart eller feil. For at funksjonen skal stoppe bruker vi stop(). For at det skal gi et varsel bruker vi warning().

For eksempel, her stopper funksjon om kommunenr kun er 2-siffer. Ved 3-siffer gis et varsel at en ledende 0 er lagt på.

lage_fylke <- function(kommunenr){
  if (nchar(kommunenr) <= 2){
    stop("Kommune nummer var ikke gjeldig.")
  }
  if (nchar(kommunenr) == 3){
    warning("Kommunenummer er lendge 3 og har blitt fylt med en ledende 0\n")
    kommunenr <- paste("0", kommunenr, sep = "")
  }
  fylke <- substr(kommunenr, 1, 2)
  fylke
}
lage_fylke(kommunenr = "03")

lage_fylke(kommunenr = "301")
Warning in lage_fylke(kommunenr = "301"): Kommunenummer er lendge 3 og har blitt fylt med en ledende 0
[1] "03"
lage_fylke(kommunenr = "0301")
[1] "03"