Modulelessen (1/2)
Functies schrijven
In R zijn functies eersteklas burgers (op zichzelf staande objecten) en stellen ze je in staat je code te structureren in modulaire, herbruikbare en goed georganiseerde blokken.
Een functie definiëren
Om een functie te definiëren, gebruikt u het trefwoord function en wijst u het gemaakte object toe aan een variabele (de functienaam) met behulp van de toewijzingsoperator <-:
# Simple function definition
greet_user <- function() {
print("Hello, User!")
}
# Invoking the function
greet_user()Parameters en retourwaarden
Functies kunnen een of meer parameters accepteren. Als u expliciet een waarde wilt retourneren, gebruikt u de functie return(). Als return() wordt weggelaten, retourneert R automatisch de waarde van de laatst geëvalueerde expressie in de hoofdtekst van de functie.
# Function that adds two numbers and returns the result
add_numbers <- function(a, b) {
sum_result <- a + b
return(sum_result)
}
total <- add_numbers(5, 7)
print(total) # Prints 12Standaardargumenten
U kunt standaardwaarden opgeven voor de parameters van een functie. Als het argument niet wordt opgegeven wanneer de functie wordt aangeroepen, gebruikt R de standaardwaarde:
# The function uses a default discount rate of 10% (0.10)
apply_discount <- function(price, discount = 0.10) {
discounted_price <- price * (1 - discount)
return(discounted_price)
}
# Uses the default (10%)
print(apply_discount(100)) # Prints 90
# Specifies a custom discount (20%)
print(apply_discount(100, 0.20)) # Prints 80Meerdere waarden retourneren met lijsten
Omdat een functie in R slechts één object rechtstreeks via return() kan retourneren, kunnen we, als we meerdere waarden moeten retourneren (mogelijk van verschillende typen of lengtes), deze in een lijst bundelen (list):
get_stats <- function(v) {
stats <- list(
mean_val = mean(v),
max_val = max(v)
)
return(stats)
}
results <- get_stats(c(10, 20, 30))
print(results$mean_val) # Prints 20Anonieme functies en sapply
Anonieme functies (functies zonder inline gedefinieerde naam) zijn uiterst handig in combinatie met functies zoals sapply() om snelle transformaties toe te passen op elementen van een vector of lijst.
In moderne R (vanaf versie 4.1.0) kun je anonieme functies definiëren met behulp van de verkorte syntaxis \(x) naast de klassieke function(x):
v <- c(1, 2, 3)
# Using sapply with a classic anonymous function
sapply(v, function(x) x^2) # 1 4 9
# Using sapply with shorthand syntax (R >= 4.1.0)
sapply(v, \(x) x^2) # 1 4 9Probeer het zelf
Definieer een functie met de naam dubbele_waarde die een enkel argument x accepteert en het dubbele (x * 2) ervan retourneert met behulp van return().
Toon hint
Usa la sintassi: double_value <- function(x) { return(x * 2) }
Oplossing beschikbaar na 3 pogingen
Definieer een functie met de naam bereken_gebied die twee argumenten accepteert: breedte en hoogte. De functie moet het product retourneren met return().
Toon hint
Definieer de functie met de parameters breedte en hoogte, en retourneer breedte * hoogte.
Oplossing beschikbaar na 3 pogingen
Definieer een functie met de naam berekenen_belasting die een vereist argumentbedrag en een optioneel argumenttarief accepteert met een standaardwaarde van 0,22. Retourneer het productbedrag * tarief.
Toon hint
Usa: bereken_belasting <- function(bedrag, tarief = 0,22) { return(bedrag * tarief) }
Oplossing beschikbaar na 3 pogingen
Definieer een functie met de naam analyse_vector die een vector v accepteert. De functie moet een lijst retourneren met twee elementen genaamd sum (de som van de vector, berekend met sum(v)) en len (de lengte van de vector, berekend met lengte(v)).
Toon hint
Gebruik de syntaxis: analyse_vector <- function(v) { return(list(sum = som(v), len = lengte(v))) }
Oplossing beschikbaar na 3 pogingen
Gegeven de vector v, gebruik dan de functie sapply() met een anonieme functie om de waarde van elk element te verdrievoudigen (vermenigvuldigen met 3). Sla het resultaat op in de verdrievoudigde variabele.
Toon hint
Gebruik: verdrievoudigd <- sapply(v, function(x) x * 3)
Oplossing beschikbaar na 3 pogingen