map() og typede varianter
Anvend funktioner på lister med map(), map_dbl(), map_chr() og map_lgl().
map() og typede varianter er en gratis R Academy-lektion på CoddyKit. Dette er lektion 1 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i R Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. R Academy-kurset indeholder 4 lektioner i alt.
Funktionel programmering med purrr
Pakken purrr leverer ensartede, typesikre værktøjer til funktionel programmering i R. I stedet for at skrive for-løkker anvender du en funktion på en liste eller vektor med map. Resultatet er renere kode, som er lettere at forstå og sammensætte.
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() — Returnerer altid en liste
map(.x, .f) anvender funktionen .f på hvert element i .x og returnerer en liste. Inputtet kan være en liste, vektor eller data frame (der itereres over kolonnerne). Dette er den mest generelle map-variant.
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() — Returnerer en numerisk vektor
map_dbl(.x, .f) anvender .f på .x og returnerer en numerisk (double) vektor. Hvis et resultat ikke er en enkelt numerisk værdi, udløser den en fejl — denne typesikkerhed opdager fejl tidligt.
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() — Returnerer en tekstvektor
map_chr(.x, .f) anvender funktionen og returnerer en tekstvektor. Det er nyttigt til at udtrække tekstattributter, formatere resultater eller opbygge filstier. Funktionen skal returnere én tekststreng pr. element.
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() — Returnerer en logisk vektor
map_lgl(.x, .f) returnerer en logisk vektor med værdierne TRUE/FALSE. Den er ideel til at teste betingelser på tværs af en liste — f.eks. til at kontrollere, hvilke elementer der opfylder et kriterium.
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() — Returnerer en heltalsvektor
map_int(.x, .f) returnerer en heltalsvektor. Brug den, når din funktion returnerer optællinger, indekser eller andre resultater med hele tal. Bemærk: I R returnerer length() og nrow() heltal.
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() — returnerer en dataramme
map_df(.x, .f) (alias: map_dfr()) anvender .f og binder resultaterne sammen række for række til én dataramme. Funktionen skal returnere en dataramme eller tibble for hvert element. map_dfc() binder i stedet kolonner sammen.
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
)
})Anonyme funktioner med ~
purrr understøtter en kompakt formelsyntaks til anonyme funktioner: ~expr, hvor .x henviser til det aktuelle element. Det undgår, at du skal skrive function(x) expr, og holder koden kort. Begge skrivemåder fungerer identisk.
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)Mapping over en navngivet liste
Når .x er en navngivet liste eller vektor, bevarer resultatet fra map() disse navne. map_dbl() og andre typede varianter fører også navnene videre, så resultaterne bliver selvforklarende.
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)Brug af map() med dataramme-kolonner
En dataramme er en liste af kolonner. map(df, fn) anvender fn på hver kolonne. Kombineret med map_dbl() er det en kompakt måde at beregne en statistik for alle kolonner på én gang.
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)Indlejring af map()-kald
Du kan indlejre map()-kald til iteration på flere niveauer — den ydre map-funktion itererer over grupper, og den indre map-funktion over parametre. Det erstatter indlejrede for-løkker med en ren, komponerbar struktur. Begræns indlejringsdybden til 2 niveauer af hensyn til læsbarheden.
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))
})Hurtigt tjek
Hvad er den vigtigste forskel mellem map() og map_dbl()?
Opsummering: map() og typede varianter
Vigtigste pointer om map() og typede varianter:
map(.x, .f)— returnerer altid en liste og er mest fleksibelmap_dbl()— returnerer en numerisk vektor og giver fejl ved forkert typemap_chr()— returnerer en tegnvektormap_lgl()— returnerer en logisk vektormap_int()— returnerer en heltalsvektormap_df()/map_dfr()— binder resultater sammen række for række til en dataramme~.x-forkortelse — kompakt syntaks til anonyme funktioner- Navngivne input giver automatisk navngivne output
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')Lær R med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 43
- Lektioner
- 159
Ofte stillede spørgsmål
Er lektionen “map() og typede varianter” gratis?
Ja — alle 3 lektioner i læringssporet R Academy, inklusive “map() og typede varianter”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. R Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “map() og typede varianter”?
Anvend funktioner på lister med map(), map_dbl(), map_chr() og map_lgl(). Du øver dig i R Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på R Academy?
Der kræves ingen tidligere erfaring. R Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 1 af 4.
Hvor lang tid tager lektionen “map() og typede varianter”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne R Academy-lektion?
Ja. Alle R Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- map() og typede varianter
- map2() og pmap() til flere input
- reduce(), accumulate() og walk()
- keep(), discard() og filtrering af lister