Przejdź do głównej treści
eLearner.app
Moduł 3 · Lekcja 1 z 25/10 w kursie~12 min
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 <-:

Code
# 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.

Code
# 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:

Code
# 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):

Code
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):

Code
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

Ćwiczenie#r.m3.l1.e1
Próby: 0Ładowanie...

Zdefiniuj funkcję o nazwie double_value, która przyjmuje pojedynczy argument x i zwraca jego podwojoną wartość (x * 2) za pomocą return().

Ładowanie edytora...
Pokaż wskazówkę

Użyj składni: double_value <- function(x) { return(x * 2) }

Rozwiązanie dostępne po 3 próbach

Ćwiczenie#r.m3.l1.e2
Próby: 0Ładowanie...

Zdefiniuj funkcję o nazwie calculate_area, która przyjmuje dwa argumenty: width i height. Funkcja musi zwracać ich iloczyn za pomocą return().

Ładowanie edytora...
Pokaż wskazówkę

Zdefiniuj funkcję z parametrami width i height i zwróć width * height.

Rozwiązanie dostępne po 3 próbach

Ćwiczenie#r.m3.l1.e3
Próby: 0Ładowanie...

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.

Ładowanie edytora...
Pokaż wskazówkę

Użyj: calculate_tax <- function(amount, rate = 0.22) { return(amount * rate) }

Rozwiązanie dostępne po 3 próbach

Ćwiczenie#r.m3.l1.e4
Próby: 0Ładowanie...

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

Ładowanie edytora...
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

Ćwiczenie#r.m3.l1.e5
Próby: 0Ładowanie...

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.

Ładowanie edytora...
Pokaż wskazówkę

Użyj: tripled <- sapply(v, function(x) x * 3)

Rozwiązanie dostępne po 3 próbach