map() i warianty typowane
Stosuj funkcje do elementów list za pomocą map(), map_dbl(), map_chr() i map_lgl().
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 funkcjamap_dbl()— zwraca wektor numeryczny; zgłasza błąd dla niewłaściwego typumap_chr()— zwraca wektor znakowymap_lgl()— zwraca wektor logicznymap_int()— zwraca wektor liczb całkowitychmap_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')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
- map() i warianty typowane
- map2() i pmap() dla wielu danych wejściowych
- reduce(), accumulate() i walk()
- keep(), discard() i filtrowanie list