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] 25Som 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] 25Bemæ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] 25Hvis 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)
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)
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()
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
Ligesom for andre funktioner i R kan du indlejre dine funktioner i hinanden.
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