R Academy · Lektion

map() og typede varianter

Anvend funktioner på lister med map(), map_dbl(), map_chr() og map_lgl().

Lektion 1 af 413 trin

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 fleksibel
  • map_dbl() — returnerer en numerisk vektor og giver fejl ved forkert type
  • map_chr() — returnerer en tegnvektor
  • map_lgl() — returnerer en logisk vektor
  • map_int() — returnerer en heltalsvektor
  • map_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')
Gratis at komme i gang

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

  1. map() og typede varianter
  2. map2() og pmap() til flere input
  3. reduce(), accumulate() og walk()
  4. keep(), discard() og filtrering af lister
← Tilbage til R Academy