Skapa funktioner i R
Du kan skapa egna funktioner för att göra din kod mer effektiv och undvika upprepningar. Det är dock inte nödvändigt att skapa egna funktioner för att använda R. En funktion skapas med följande struktur:
my_function <- function(argument1, argument2) {
body
}
Notera följande:
- Funktionen skapas med
function()
. - I
function()
specificeras funktionens argument. Flera argument kan finnas. - Inom hakparentes (
{}
) finns funktionens kropp (eng. body). Där finns funktionens instruktioner. - Funktionen skickas till objektet
my_function
som därefter kan användas för att köra funktionen.
Låt oss skapa en funktion med två argument som multipliceras med varandra. Vi kallar funktionen för my_first_function
:
my_first_function <- function(argument1, argument2) {
argument1*argument2
}
Nu provar vi funktionen:
my_first_function(argument1=5, argument2=5)
[1] 25
Som för alla andra funktioner kan vi avstå från att använda argumentens namn. Då kommer värdena som vi anger skickas till ett argument i taget:
my_first_function(5, 5)
[1] 25
Observera i detta exempel att R returnerar det allra sista värdet som funktionen skapade. Man kan och bör dock vara explicit med vad man vill returnera, vilket man gör med funktionen return()
. Vi gör om funktionen så att det skapas ett objekt (product
) som vi sedan returnerar:
my_first_function <- function(argument1, argument2) {
product = argument1*argument2
return(product)
}
Låt oss prova funktionen:
my_first_function(5, 5)
[1] 25
Om man inte specificerar return() kommer således R automatiskt att returnera det sista objektet som skapades.
Låt oss skapa en ny funktion som har två argument, nämligen ett x-värde och ett y-värde för en koordinat på en graf. Funktionen kallar vi to_plot
och den använder funktionen plot()
för att skapa grafen:
to_plot <- function(x, y) {
plot(x, y)
}
Vi testar funktionen och specificerar x till 1 och y till 5:
to_plot(x=1, y=5)
Nästa funktion låter användaren slumpmässigt generera siffror som sedan visualiseras på en graf. Användaren skall ange hur många värden som skall genereras, samt vad medelvärdet skall vara för värdena på x-axeln samt värdena på y-axeln.
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 provar funktionen och anger att 100 värden skall genereras, med 10 i medelvärde på x-axeln och 100 i medelvärde på y-axeln:
to_plot(random_numbers=100, x_mean=10, y_mean=100)
Låt oss skapa samma funktion igen men nu med default-värden för samtliga parametrar. Det göra att vi kommer kunna köra funktionen utan att specificiera argumenten!
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)
}
# Provar funktionen
to_plot()
Ovanstående funktioner är mycket simpla och närmast överflödiga. Syftet med de är att illustrera hur funktioner kan definieras i R. I verkligheten har funktioner mellan 5 och 50 rader. Längre funktioner kan med fördel brytas upp i flera funktioner.
Vi ska nu skapa en lite mer invecklad funktion. Den skall göra flera saker, som t ex ladda ett paket, skapa en graf, spara grafen som en PDF-fil och även presentera grafen. I funktionen finns nu kommentarer som förtydligar vad vi gör i vare steg:
# Skapar funktionen to_plot()
# Funktionen har argumenten random_numbers, x_mean, y_mean, title
to_plot <- function(random_numbers=20, x_mean=10, y_mean=10, my_title) {
# Aktiverar paketet ggplot2 som används för att skapa grafer
library(ggplot2)
# Skapar x-värden
x <- rnorm(n = random_numbers, mean = x_mean)
# logaritmerar x-värden
x <- log(x)
# Skapar y-värden
y <- rnorm(n = random_numbers, mean = y_mean)
# Kvadrerar y-värden
y = y^2
# Sparar x och y i en data frame
my_data <- data.frame(x, y)
# Skapar en graf
my_plot <- ggplot(my_data, aes(x=x, y=y)) +
# Begär att få se punkter på grafen
geom_point() +
# Anger grafens titel ska vara lika med funktionens title-argument
labs(title=my_title)
# Sparar grafen som en PDF-fil
ggsave(plot=my_plot, filename='my_plot.pdf')
return(my_plot)
}
# Provar funktionen
to_plot(random_numbers=10, x_mean=10, y_mean=10, my_title="Min första graf")
Saving 7 x 5 in image
Liksom för andra funktioner i R kan du bädda in dina funktioner i varandra.
Funktioner
- Skapa en funktion med syntax:
name <- function(...args...) {...body...}
. - Använd funktionen med syntax:
name(...values...)
. - Använd kommentarer när du skapar funktioner
- R looks for variables in the current stack frame before looking for them at the top level.
- Ange default-värden för argument när det är lämpligt