Lage egne funksjoner i R

Lage funksjoner i R

Du kan lage egne funksjoner for å gjøre koden din mer effektiv og unngå gjentakelser. Det er likevel ikke nødvendig å lage egne funksjoner for å bruke R. En funksjon lages med følgende struktur:

my_function <- function(argument1, argument2) {
  body
}

Merk følgende:

  • Funksjonen lages med function().
  • I function() spesifiseres funksjonens argumenter. Det kan være flere argumenter.
  • Innenfor krøllparentesene ([{}](https://rdrr.io/r/base/Paren.html)) finner du funksjonens kropp (eng. body). Der ligger funksjonens instruksjoner.
  • Funksjonen tilordnes objektet my_function, som deretter kan brukes til å kjøre funksjonen.

La oss lage en funksjon med to argumenter som multipliseres med hverandre. Vi kaller funksjonen my_first_function:

my_first_function <- function(argument1, argument2) {
  argument1*argument2
}

Nå prøver vi funksjonen:

my_first_function(argument1=5, argument2=5)
[1] 25

Som for alle andre funksjoner kan vi la være å bruke argumentenes navn. Da blir verdiene vi oppgir, sendt til ett argument om gangen:

my_first_function(5, 5)
[1] 25

Legg merke til at R i dette eksemplet returnerer den aller siste verdien som funksjonen lagde. Man kan og bør likevel være eksplisitt med hva man vil returnere, og det gjør man med funksjonen [return()](https://rdrr.io/r/base/function.html). Vi skriver om funksjonen slik at det lages et objekt (product) som vi deretter returnerer:

my_first_function <- function(argument1, argument2) {
  product = argument1*argument2
  return(product)
}

La oss prøve funksjonen:

my_first_function(5, 5)
[1] 25

Hvis man ikke spesifiserer return(), vil R altså automatisk returnere det siste objektet som ble laget.

La oss lage en ny funksjon som har to argumenter, nemlig en x-verdi og en y-verdi for en koordinat på en graf. Funksjonen kaller vi to_plot, og den bruker funksjonen [plot()](https://rdrr.io/r/graphics/plot.default.html) til å lage grafen:

to_plot <- function(x, y) {
  plot(x, y)
}

Vi tester funksjonen og setter x til 1 og y til 5:

to_plot(x=1, y=5)
Spredningsdiagram fra plot() med ett enkelt punkt ved x = 1 og y = 5

Den neste funksjonen lar brukeren generere tilfeldige tall som deretter visualiseres på en graf. Brukeren skal oppgi hvor mange verdier som skal genereres, og hva gjennomsnittet skal være for verdiene på x-aksen og verdiene på y-aksen.

to_plot <- function(random_numbers, x_mean, y_mean) {
  x <- rnorm(n = random_numbers, mean = x_mean)
  y <- rnorm(n = random_numbers, mean = y_mean)
  return(plot(x, y))
}

Vi prøver funksjonen og angir at 100 verdier skal genereres, med gjennomsnitt 10 på x-aksen og gjennomsnitt 100 på y-aksen:

to_plot(random_numbers=100, x_mean=10, y_mean=100)
Spredningsdiagram med 100 tilfeldige punkter, x rundt 10 og y rundt 100

La oss lage den samme funksjonen igjen, men nå med standardverdier (default-verdier) for alle parameterne. Det gjør at vi kan kjøre funksjonen uten å spesifisere argumentene!

to_plot <- function(random_numbers=20, x_mean=1, y_mean=10) {
  x <- rnorm(n = random_numbers, mean = x_mean)
  y <- rnorm(n = random_numbers, mean = y_mean)
  plot(x, y)
}

## Prøver funksjonen
to_plot()
Spredningsdiagram med 20 tilfeldige punkter, x mellom 0 og 2,7 og y rundt 10, laget med standardverdier

Funksjonene ovenfor er svært enkle og nærmest overflødige. Hensikten med dem er å illustrere hvordan funksjoner kan defineres i R. I virkeligheten har funksjoner mellom 5 og 50 linjer. Lengre funksjoner kan med fordel deles opp i flere funksjoner.

Vi skal nå lage en litt mer innviklet funksjon. Den skal gjøre flere ting, for eksempel laste inn en pakke, lage en graf, lagre grafen som en PDF-fil og også vise grafen. I funksjonen finnes nå kommentarer som tydeliggjør hva vi gjør i hvert trinn:

## Lager funksjonen to_plot()
## Funksjonen har argumentene random_numbers, x_mean, y_mean, title
to_plot <- function(random_numbers=20, x_mean=10, y_mean=10, my_title) {
  # Aktiverer pakken ggplot2, som brukes til å lage grafer
  library(ggplot2)

  # Lager x-verdier
  x <- rnorm(n = random_numbers, mean = x_mean)
  # logaritmerer x-verdier
  x <- log(x)

  # Lager y-verdier
  y <- rnorm(n = random_numbers, mean = y_mean)
  # Kvadrerer y-verdier
  y = y^2

  # Lagrer x og y i en data frame
  my_data <- data.frame(x, y)

  # Lager en graf
  my_plot <- ggplot(my_data, aes(x=x, y=y)) +
    # Ber om å få se punkter på grafen
    geom_point() +
    # Angir at grafens tittel skal være lik funksjonens title-argument
    labs(title=my_title)

  # Lagrer grafen som en PDF-fil
  ggsave(plot=my_plot, filename='my_plot.pdf')
  return(my_plot)
}

## Prøver funksjonen
to_plot(random_numbers=10, x_mean=10, y_mean=10, my_title="Min första graf")
Saving 7 x 5 in image
ggplot2-spredningsdiagram med ti punkter, logaritmerte x-verdier og kvadrerte y-verdier, tittelen Min första graf

Som for andre funksjoner i R kan du bygge inn funksjonene dine i hverandre.

Ikon av et programvindu med fargede kodelinjer

Funksjoner

  • Lag en funksjon med syntaksen: name <- function(...args...) {...body...}.
  • Bruk funksjonen med syntaksen: name(...values...).
  • Bruk kommentarer når du lager funksjoner
  • R leter etter variabler i den gjeldende stack frame før den leter etter dem på øverste nivå.
  • Angi standardverdier (default-verdier) for argumenter når det er hensiktsmessig