0Pricing
R Academy · Lektion

map2() und pmap() für mehrere Eingaben

Iterieren Sie mit map2() und pmap() gleichzeitig über zwei oder mehr Listen.

map2() und pmap() für mehrere Eingaben ist eine kostenlose R Academy-Lektion auf CoddyKit. Dies ist Lektion 2 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des R Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der R Academy-Kurs umfasst insgesamt 4 Lektionen.

Über mehrere Eingaben iterieren

map() iteriert jeweils über eine Eingabe. Viele Funktionen benötigen jedoch zwei oder mehr parallele Eingaben. purrr verarbeitet mit map2() zwei Eingaben und mit pmap() beliebig viele. Beide Funktionen gewährleisten weiterhin Rückgabewerte mit einem sicheren Typ.

library(purrr)

# Simulate: add corresponding elements from two vectors
x <- c(1, 2, 3, 4)
y <- c(10, 20, 30, 40)

# map2 applies fn(x[i], y[i]) for each i
result <- map2(x, y, function(a, b) a + b)
print(result)

map2() — Zwei parallele Eingaben

map2(.x, .y, .f) wendet .f(x_i, y_i) auf die jeweils zusammengehörigen Elemente von .x und .y an. Beide Vektoren müssen dieselbe Länge haben (oder einer hat die Länge 1 und wird recycelt). Die Funktion gibt eine Liste zurück.

library(purrr)

names_vec <- c('Alice','Bob','Carol')
scores_vec <- c(85, 92, 78)

# Build a personalized message for each student
map2_chr(names_vec, scores_vec,
         ~paste(.x, 'scored', .y, 'points'))

map2() mit der ~-Kurzschreibweise

Die Formelschreibweise ~expr funktioniert auch mit map2(): .x verweist auf die erste Eingabe und .y auf die zweite. Dadurch bleiben anonyme Funktionen mit zwei Argumenten kompakt.

library(purrr)

lower_bounds <- c(0, 10, 20, 50)
upper_bounds <- c(9, 19, 49, 100)

# Create labels for each range
map2_chr(lower_bounds, upper_bounds,
         ~paste0('[', .x, '-', .y, ']'))

Typisierte map2()-Varianten

Wie map() verfügt auch map2() über typisierte Varianten für typsichere Rückgabewerte: map2_dbl(), map2_chr(), map2_lgl(), map2_int() und map2_df(). Verwenden Sie die Variante, die dem erwarteten Ausgabetyp entspricht.

library(purrr)

actual <- c(100, 150, 200, 120)
target <- c(110, 140, 195, 130)

# Numeric: percentage achievement
map2_dbl(actual, target, ~round(100 * .x / .y, 1))

# Logical: did they meet their target?
map2_lgl(actual, target, ~.x >= .y)

pmap() — Beliebig viele Eingaben

pmap(.l, .f) erwartet als erstes Argument eine Liste von Vektoren. Jeder Vektor ist ein separater Eingabestrom. Die Funktion erhält gleichzeitig die jeweils zusammengehörigen Elemente aller Eingabeströme.

library(purrr)

# Three parallel inputs
params <- list(
  name = c('Alice','Bob','Carol'),
  score = c(85, 92, 78),
  grade = c('B','A','C')
)

pmap_chr(params, function(name, score, grade) {
  paste(name, ':', score, '(', grade, ')')
})

pmap() mit einem Data Frame

Ein Data Frame ist eine Liste von Spalten — Sie können ihn daher direkt als erstes Argument an pmap() übergeben. Die Funktion erhält die Werte einer Zeile als benannte Argumente, wobei die Spaltennamen den Parameternamen entsprechen.

library(purrr)

params_df <- data.frame(
  mean_val = c(0, 5, 10),
  sd_val = c(1, 2, 3),
  n = c(100, 50, 200)
)

# Generate samples from different normal distributions
set.seed(42)
results <- pmap(params_df, function(mean_val, sd_val, n) {
  rnorm(n, mean=mean_val, sd=sd_val)
})

map_dbl(results, mean)

Über Parameterkombinationen iterieren

Eine häufige Verwendung von pmap() ist die Iteration über ein Raster von Modellparametern. Verwenden Sie expand.grid() oder tidyr::expand_grid(), um die Parameterkombinationen zu erstellen, und anschließend pmap(), um das Experiment für jede Zeile auszuführen.

library(purrr)

# Create a parameter grid
grid <- expand.grid(
  learning_rate = c(0.01, 0.1),
  epochs = c(10, 50),
  batch_size = c(32, 64)
)

# Simulate model training results
set.seed(42)
grid$accuracy <- pmap_dbl(grid, function(learning_rate, epochs, batch_size) {
  base <- 0.5 + 0.3 * log10(epochs) + 0.1 * learning_rate
  round(min(base + rnorm(1, 0, 0.02), 0.99), 3)
})

print(grid[order(-grid$accuracy),])

map2_df() — Data Frames erstellen

map2_df() (oder map2_dfr()) wendet eine Funktion auf zwei parallele Eingaben an und fügt die resultierenden Data Frames zeilenweise zusammen. Das ist besonders nützlich, um zwei Elementmengen zu vergleichen oder parallele Datensätze zusammenzuführen.

library(purrr)

q1_sales <- list(East=100, West=200, North=80)
q2_sales <- list(East=120, West=190, North=95)

map2_df(q1_sales, q2_sales, function(q1, q2) {
  data.frame(
    q1 = q1,
    q2 = q2,
    change = q2 - q1,
    pct = round(100*(q2-q1)/q1, 1)
  )
}, .id = 'region')

pmap() mit nest() kombinieren

Die Kombination von pmap() mit verschachtelten Data Frames und Modellparametern ermöglicht ein leistungsfähiges Muster: Speichern Sie Hyperparameter und Daten in einem Data Frame und verwenden Sie anschließend pmap() für die Zeilen, um mit jedem Parametersatz Modelle anzupassen.

library(purrr)
library(dplyr)

# Simulate polynomial regression with different degrees
set.seed(42)
x <- 1:20
y <- 2*x + 0.5*x^2 + rnorm(20, 0, 10)
df <- data.frame(x=x, y=y)

configs <- data.frame(degree = 1:3)
configs$r2 <- map_dbl(configs$degree, function(d) {
  m <- lm(y ~ poly(x, d), data=df)
  summary(m)$r.squared
})

print(configs)

Fehlerbehandlung mit possibly()

In Workflows mit map2()/pmap() kann eine einzige fehlerhafte Eingabe den gesamten Vorgang abbrechen. Umschließen Sie Ihre Funktion mit possibly(fn, otherwise=NA), um Fehler abzufangen und einen Standardwert zurückzugeben. So läuft die Pipeline weiter, auch wenn einige Eingaben fehlschlagen.

library(purrr)

safe_log <- possibly(log, otherwise=NA_real_)

values <- list(10, -5, 100, 0, 50)

# Without possibly(): log() warns for negative numbers
# With possibly(): errors return NA, computation continues
map_dbl(values, safe_log)

Praxis: Kreuzvalidierung mit pmap()

Eine praktische Anwendung von pmap() ist die Durchführung einer k-fachen Kreuzvalidierung durch Iteration über die Fold-Zuordnungen. pmap() übergibt die Trainings- und Testdaten jedes Folds an die Anpassungsfunktion und gibt pro Fold eine Leistungskennzahl zurück.

library(purrr)

set.seed(42)
df <- data.frame(x=1:20, y=2*(1:20)+rnorm(20,0,3))
df$fold <- sample(rep(1:5, 4))

# Compute RMSE for each held-out fold
folds <- 1:5
rmse_vals <- map_dbl(folds, function(k) {
  train <- df[df$fold != k, ]
  test <- df[df$fold == k, ]
  m <- lm(y ~ x, data=train)
  preds <- predict(m, newdata=test)
  sqrt(mean((test$y - preds)^2))
})

cat('Per-fold RMSE:', round(rmse_vals, 2), '\n')
cat('Mean RMSE:', round(mean(rmse_vals), 2))

Kurzer Test

Welche purrr-Funktion eignet sich, um gleichzeitig über mehr als zwei parallele Eingabevektoren zu iterieren?

Zusammenfassung: map2() und pmap()

Die wichtigsten Punkte zur Abbildung mit mehreren Eingaben:

  • map2(.x, .y, .f) — iteriert über zwei parallele Eingaben; .x und .y in der ~-Kurzschreibweise
  • map2_dbl/chr/lgl/int/df() — typisierte Varianten für typsichere Rückgabewerte
  • pmap(.l, .f) — iteriert gleichzeitig über eine Liste mit beliebig vielen Vektoren
  • Übergeben Sie einen Data Frame an pmap() — die Spaltennamen werden zu Funktionsparameternamen
  • Verwenden Sie expand.grid() + pmap() für die Suche über ein Parameter-Raster
  • Umschließen Sie Funktionen mit possibly(fn, NA), um Fehler sicher zu behandeln
library(purrr)

# pmap with a data frame: each row = one function call
params <- data.frame(
  mean_val = c(0, 10, 100),
  sd_val = c(1, 5, 20),
  label = c('control','mid','high')
)

pmap_chr(params, function(mean_val, sd_val, label) {
  sprintf('%s: mean=%.0f, sd=%.0f', label, mean_val, sd_val)
})

Häufig gestellte Fragen

Ist die Lektion „map2() und pmap() für mehrere Eingaben“ kostenlos?

Ja — der vollständige Text von „map2() und pmap() für mehrere Eingaben“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des R Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der R Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „map2() und pmap() für mehrere Eingaben“?

Iterieren Sie mit map2() und pmap() gleichzeitig über zwei oder mehr Listen. Du übst R Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um R Academy zu starten?

Keine Vorkenntnisse erforderlich. R Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 2 von 4.

Wie lange dauert die Lektion „map2() und pmap() für mehrere Eingaben“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser R Academy-Lektion Code schreiben und ausführen?

Ja. Jede R Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. map() und typisierte Varianten
  2. map2() und pmap() für mehrere Eingaben
  3. reduce(), accumulate() und walk()
  4. keep(), discard() und Listenfilterung
← Zurück zu R Academy