Lav egne funktioner i R

Lav funktioner i R

Du kan lave egne funktioner for at gøre din kode mere effektiv og undgå gentagelser. Det er dog ikke nødvendigt at lave egne funktioner for at bruge R. En funktion oprettes med følgende struktur:

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

Bemærk følgende:

  • Funktionen oprettes med function().
  • I function() angives funktionens argumenter. Der kan være flere argumenter.
  • Inden for tuborgklammerne ([{}](https://rdrr.io/r/base/Paren.html)) findes funktionens krop (eng. body). Her står funktionens instruktioner.
  • Funktionen tildeles objektet my_function, som derefter kan bruges til at køre funktionen.

Lad os lave en funktion med to argumenter, der ganges med hinanden. Vi kalder funktionen my_first_function:

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

Nu afprøver vi funktionen:

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

Som for alle andre funktioner kan vi undlade at bruge argumenternes navne. Så bliver de værdier, vi angiver, overført til ét argument ad gangen:

my_first_function(5, 5)
[1] 25

Bemærk i dette eksempel, at R returnerer den allersidste værdi, som funktionen skabte. Man kan og bør dog være eksplicit med, hvad man vil returnere, hvilket man gør med funktionen [return()](https://rdrr.io/r/base/function.html). Vi omskriver funktionen, så der oprettes et objekt (product), som vi derefter returnerer:

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

Lad os afprøve funktionen:

my_first_function(5, 5)
[1] 25

Hvis man ikke angiver return(), vil R altså automatisk returnere det sidste objekt, der blev oprettet.

Lad os lave en ny funktion med to argumenter, nemlig en x-værdi og en y-værdi for en koordinat på en graf. Funktionen kalder vi to_plot, og den bruger funktionen [plot()](https://rdrr.io/r/graphics/plot.default.html) til at lave grafen:

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

Vi tester funktionen og sætter x til 1 og y til 5:

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

Den næste funktion lader brugeren generere tilfældige tal, som derefter visualiseres på en graf. Brugeren skal angive, hvor mange værdier der skal genereres, samt hvad middelværdien skal være for værdierne på x-aksen og værdierne 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 afprøver funktionen og angiver, at der skal genereres 100 værdier med middelværdi 10 på x-aksen og middelværdi 100 på y-aksen:

to_plot(random_numbers=100, x_mean=10, y_mean=100)
Punktdiagram med 100 tilfældige punkter, x omkring 10 og y omkring 100

Lad os lave den samme funktion igen, men nu med standardværdier (default-værdier) for samtlige parametre. Det betyder, at vi kan køre funktionen uden at angive argumenterne!

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)
}

## Afprøver funktionen
to_plot()
Punktdiagram med 20 tilfældige punkter, x mellem 0 og 2,7 og y omkring 10, lavet med standardværdier

Ovenstående funktioner er meget simple og nærmest overflødige. Formålet med dem er at illustrere, hvordan funktioner kan defineres i R. I virkeligheden har funktioner mellem 5 og 50 linjer. Længere funktioner kan med fordel deles op i flere funktioner.

Vi skal nu lave en lidt mere indviklet funktion. Den skal gøre flere ting, f.eks. indlæse en pakke, lave en graf, gemme grafen som en PDF-fil og også vise grafen. I funktionen er der nu kommentarer, der tydeliggør, hvad vi gør i hvert trin:

## Opretter funktionen to_plot()
## Funktionen har argumenterne 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 bruges til at lave grafer
  library(ggplot2)

  # Opretter x-værdier
  x <- rnorm(n = random_numbers, mean = x_mean)
  # logaritmerer x-værdier
  x <- log(x)

  # Opretter y-værdier
  y <- rnorm(n = random_numbers, mean = y_mean)
  # Kvadrerer y-værdier
  y = y^2

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

  # Laver en graf
  my_plot <- ggplot(my_data, aes(x=x, y=y)) +
    # Beder om at få vist punkter på grafen
    geom_point() +
    # Angiver, at grafens titel skal være lig med funktionens title-argument
    labs(title=my_title)

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

## Afprøver funktionen
to_plot(random_numbers=10, x_mean=10, y_mean=10, my_title="Min första graf")
Saving 7 x 5 in image
ggplot2-punktdiagram med ti punkter, logaritmerede x-værdier og kvadrerede y-værdier, titlen Min första graf

Ligesom for andre funktioner i R kan du indlejre dine funktioner i hinanden.

Ikon af et programvindue med farvede kodelinjer

Funktioner

  • Lav en funktion med syntaksen: name <- function(...args...) {...body...}.
  • Brug funktionen med syntaksen: name(...values...).
  • Brug kommentarer, når du laver funktioner
  • R looks for variables in the current stack frame before looking for them at the top level.
  • Angiv standardværdier (default-værdier) for argumenter, når det er hensigtsmæssigt