Lekcje modułu (1/2)
Pisanie Funkcji
W R funkcje są obiektami pierwszej kategorii (first-class citizens) i pozwalają na strukturyzowanie kodu w modułowe, wielokrotnego użytku i dobrze zorganizowane bloki.
Definiowanie Funkcji
Aby zdefiniować funkcję, używa się słowa kluczowego function i przypisuje utworzony obiekt do zmiennej (nazwy funkcji) za pomocą operatora przypisania <-:
# Definicja prostej funkcji
greet_user <- function() {
print("Hello, User!")
}
# Wywołanie funkcji
greet_user()
Parametry i Wartości Zwracane
Funkcje mogą przyjmować jeden lub więcej parametrów. Aby jawnie zwrócić wartość, używa się funkcji return(). Jeśli return() zostanie pominięte, R automatycznie zwróci wartość ostatniego wyrażenia obliczonego w ciele funkcji.
# Funkcja, która sumuje dwie liczby i zwraca wynik
add_numbers <- function(a, b) {
sum_result <- a + b
return(sum_result)
}
total <- add_numbers(5, 7)
print(total) # Wypisze 12
Argumenty Domyślne (Default)
Możliwe jest określenie wartości domyślnych dla parametrów funkcji. Jeśli przy wywołaniu argument nie zostanie podany, R użyje wartości domyślnej:
# Funkcja używa domyślnego rabatu w wysokości 10% (0.10)
apply_discount <- function(price, discount = 0.10) {
discounted_price <- price * (1 - discount)
return(discounted_price)
}
# Używa wartości domyślnej (10%)
print(apply_discount(100)) # Wypisze 90
# Określa własny rabat (20%)
print(apply_discount(100, 0.20)) # Wypisze 80
Zwracanie wielu wartości za pomocą List
Ponieważ funkcja w R może bezpośrednio zwrócić tylko jeden obiekt za pomocą return(), jeśli zachodzi potrzeba zwrócenia wielu wartości (np. o różnych typach lub długościach), możemy zebrać je wewnątrz listy (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) # Wypisze 20
Funkcje Anonimowe i sapply
Funkcje anonimowe (czyli funkcje bez nazwy, definiowane "w locie") są niezwykle przydatne, gdy są połączone z funkcjami takimi jak sapply() do szybkiego stosowania transformacji na elementach wektora lub listy.
W nowoczesnym R (od wersji 4.1.0) możliwe jest definiowanie funkcji anonimowych przy użyciu skróconej składni \(x) oprócz klasycznej function(x):
v <- c(1, 2, 3)
# Użycie sapply z klasyczną funkcją anonimową
sapply(v, function(x) x^2) # 1 4 9
# Użycie sapply ze składnią skróconą (R >= 4.1.0)
sapply(v, \(x) x^2) # 1 4 9
Spróbuj sam
Zdefiniuj funkcję o nazwie double_value, która przyjmuje pojedynczy argument x i zwraca jego podwojoną wartość (x * 2) za pomocą return().
Pokaż wskazówkę
Użyj składni: double_value <- function(x) { return(x * 2) }
Rozwiązanie dostępne po 3 próbach
Zdefiniuj funkcję o nazwie calculate_area, która przyjmuje dwa argumenty: width i height. Funkcja musi zwracać ich iloczyn za pomocą return().
Pokaż wskazówkę
Zdefiniuj funkcję z parametrami width i height i zwróć width * height.
Rozwiązanie dostępne po 3 próbach
Zdefiniuj funkcję o nazwie calculate_tax, która przyjmuje jeden wymagany argument amount i jeden opcjonalny argument rate z wartością domyślną 0.22. Zwróć iloczyn amount * rate.
Pokaż wskazówkę
Użyj: calculate_tax <- function(amount, rate = 0.22) { return(amount * rate) }
Rozwiązanie dostępne po 3 próbach
Zdefiniuj funkcję o nazwie analyze_vector, która przyjmuje wektor v. Funkcja musi zwracać listę zawierającą dwa elementy o nazwach sum (suma wektora, obliczona za pomocą sum(v)) oraz len (długość wektora, obliczona za pomocą length(v)).
Pokaż wskazówkę
Użyj składni: analyze_vector <- function(v) { return(list(sum = sum(v), len = length(v))) }
Rozwiązanie dostępne po 3 próbach
Dla danego wektora v, użyj funkcji sapply() z funkcją anonimową, aby potroić wartość każdego elementu (mnożąc go przez 3). Zapisz wynik w zmiennej tripled.
Pokaż wskazówkę
Użyj: tripled <- sapply(v, function(x) x * 3)
Rozwiązanie dostępne po 3 próbach