R Academy · Lekcja

map() i warianty typowane

Stosuj funkcje do elementów list za pomocą map(), map_dbl(), map_chr() i map_lgl().

Lekcja 1 z 413 kroki

map() i warianty typowane to bezpłatna lekcja R Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej R Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs R Academy zawiera 4 lekcji w sumie.

Programowanie funkcyjne za pomocą purrr

Pakiet purrr udostępnia spójne i bezpieczne typowo narzędzia do programowania funkcyjnego w języku R. Zamiast pisać pętle for, można mapować funkcję na listę lub wektor. Rezultatem jest bardziej przejrzysty kod, który łatwiej analizować i łączyć w większe konstrukcje.

library(purrr)

# A list of numbers
numbers <- list(1, 4, 9, 16, 25)

# Apply sqrt() to each element
result <- map(numbers, sqrt)
print(result)

map() — Zawsze zwraca listę

map(.x, .f) stosuje funkcję .f do każdego elementu .x i zwraca listę. Dane wejściowe mogą być listą, wektorem lub ramką danych (iteruje wtedy po kolumnach). Jest to najbardziej ogólny wariant funkcji mapującej.

library(purrr)

# Map over a character vector
fruits <- c('apple', 'banana', 'cherry')

# nchar() counts characters in each string
result <- map(fruits, nchar)
print(result)  # Returns a list
print(class(result))

map_dbl() — Zwraca wektor numeryczny

map_dbl(.x, .f) stosuje funkcję .f do elementów .x i zwraca wektor numeryczny (double). Jeśli którykolwiek wynik nie jest pojedynczą wartością numeryczną, funkcja zgłasza błąd — bezpieczeństwo typów pomaga wcześnie wykrywać takie błędy.

library(purrr)

groups <- list(
  A = c(10, 20, 30),
  B = c(5, 15, 25, 35),
  C = c(100, 200)
)

# Compute mean for each group — returns a named numeric vector
means <- map_dbl(groups, mean)
print(means)
print(class(means))

map_chr() — Zwraca wektor znakowy

map_chr(.x, .f) mapuje funkcję i zwraca wektor znakowy. Jest przydatna do wyodrębniania atrybutów tekstowych, formatowania wyników lub tworzenia ścieżek plików. Funkcja musi zwracać jeden ciąg znaków dla każdego elementu.

library(purrr)

models <- list(
  m1 = lm(mpg ~ wt, data=mtcars),
  m2 = lm(mpg ~ hp, data=mtcars),
  m3 = lm(mpg ~ cyl, data=mtcars)
)

# Extract the formula from each model as a string
map_chr(models, function(m) deparse(formula(m)))

map_lgl() — Zwraca wektor logiczny

map_lgl(.x, .f) zwraca wektor logiczny zawierający wartości TRUE/FALSE. Doskonale nadaje się do sprawdzania warunków w całej liście — na przykład do określania, które elementy spełniają dane kryterium.

library(purrr)

datasets <- list(
  df1 = data.frame(x=1:3, y=c(NA,2,3)),
  df2 = data.frame(x=1:3, y=4:6),
  df3 = data.frame(x=c(NA,NA,3), y=1:3)
)

# Does each data frame contain any NA values?
map_lgl(datasets, function(df) anyNA(df))

map_int() — Zwraca wektor całkowity

map_int(.x, .f) zwraca wektor całkowity. Należy go używać, gdy funkcja zwraca zliczenia, indeksy lub inne wyniki w postaci liczb całkowitych. Uwaga: w języku R funkcje length() i nrow() zwracają liczby całkowite.

library(purrr)

my_lists <- list(
  a = 1:10,
  b = letters[1:5],
  c = c(TRUE, FALSE, TRUE, TRUE)
)

# Count elements in each list item
map_int(my_lists, length)

map_df() / map_dfr() — zwraca ramkę danych

map_df(.x, .f) (alias: map_dfr()) stosuje .f, a następnie łączy wyniki wierszami w jedną ramkę danych. Dla każdego elementu funkcja musi zwracać ramkę danych lub tibble. map_dfc() łączy wyniki kolumnami.

library(purrr)

files <- c('sales_q1', 'sales_q2', 'sales_q3')

# Simulate reading and labeling each file
map_df(files, function(f) {
  data.frame(
    file = f,
    rows = sample(50:100, 1),
    cols = 5
  )
})

Funkcje anonimowe z użyciem ~

purrr obsługuje skróconą składnię formuł dla funkcji anonimowych: ~expr, gdzie .x oznacza bieżący element. Dzięki temu nie trzeba zapisywać function(x) expr, a kod pozostaje zwięzły. Oba style działają identycznie.

library(purrr)

numbers <- list(1, 4, 9, 16, 25)

# Three equivalent ways:
result1 <- map(numbers, function(x) x^2)
result2 <- map(numbers, ~.x^2)
result3 <- map_dbl(numbers, ~.x^2)

print(result2)
print(result3)

Mapowanie po nazwanej liście

Gdy .x jest nazwaną listą lub wektorem, wynik map() zachowuje te nazwy. map_dbl() i inne warianty typowane również zachowują nazwy, dzięki czemu wyniki same opisują swoją zawartość.

library(purrr)

region_data <- list(
  East = c(100, 120, 115, 130),
  West = c(200, 195, 210, 205),
  North = c(80, 85, 90, 88)
)

# Named results
map_dbl(region_data, mean)

Używanie map() z kolumnami ramki danych

Ramka danych jest listą kolumn. map(df, fn) stosuje fn do każdej kolumny. W połączeniu z map_dbl() jest to zwięzły sposób na obliczenie statystyki dla wszystkich kolumn naraz.

library(purrr)

df <- data.frame(
  score_a = c(85, 90, 78, 92),
  score_b = c(88, 85, 80, 95),
  score_c = c(92, 88, 84, 90)
)

# Mean of every column
map_dbl(df, mean)

Zagnieżdżanie wywołań map()

Można zagnieżdżać wywołania map(), aby iterować na wielu poziomach — zewnętrzne mapowanie wykonuje się po grupach, a wewnętrzne po parametrach. Zastępuje to zagnieżdżone pętle for przejrzystą i kompozycyjną strukturą. Dla czytelności należy ograniczyć zagnieżdżenie do 2 poziomów.

library(purrr)

groups <- list(A = 1:5, B = 6:10)
functions <- list(mean=mean, sd=sd, min=min)

# Apply each function to each group
map(groups, function(g) {
  map_dbl(functions, function(f) f(g))
})

Szybkie sprawdzenie

Jaka jest kluczowa różnica między map() a map_dbl()?

Podsumowanie: map() i warianty typowane

Najważniejsze informacje o map() i wariantach typowanych:

  • map(.x, .f) — zawsze zwraca listę; najbardziej elastyczna funkcja
  • map_dbl() — zwraca wektor numeryczny; zgłasza błąd dla niewłaściwego typu
  • map_chr() — zwraca wektor znakowy
  • map_lgl() — zwraca wektor logiczny
  • map_int() — zwraca wektor liczb całkowitych
  • map_df() / map_dfr() — łączy wyniki wierszami w ramkę danych
  • Skrót ~.x — zwięzła składnia funkcji anonimowej
  • W nazwanych danych wejściowych nazwy są automatycznie przenoszone do wyników
library(purrr)

# Typed map showcase
data_list <- list(
  group_A = c(10, 20, 30),
  group_B = c(5, 15),
  group_C = c(100, 200, 300, 400)
)

cat('Counts:', map_int(data_list, length), '\n')
cat('Means: ', map_dbl(data_list, mean), '\n')
cat('Any>50:', map_lgl(data_list, ~any(.x > 50)), '\n')
Bezpłatny start

Ucz się R dzięki korepetycjom AI — za darmo

Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.

Kursy
43
Lekcje
159

Często zadawane pytania

Czy lekcja „map() i warianty typowane” jest bezpłatna?

Tak — pełny tekst „map() i warianty typowane” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu R Academy, przejdź na CoddyKit PRO. Kurs R Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „map() i warianty typowane”?

Stosuj funkcje do elementów list za pomocą map(), map_dbl(), map_chr() i map_lgl(). Ćwiczysz R Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć R Academy?

Nie wymagamy żadnego doświadczenia. R Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.

Ile czasu zajmuje lekcja „map() i warianty typowane”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji R Academy?

Tak. Każda lekcja R Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. map() i warianty typowane
  2. map2() i pmap() dla wielu danych wejściowych
  3. reduce(), accumulate() i walk()
  4. keep(), discard() i filtrowanie list
← Powrót do R Academy