map2() dan pmap() untuk Banyak Input
Lakukan iterasi pada dua atau lebih daftar secara bersamaan dengan map2() dan pmap().
map2() dan pmap() untuk Banyak Input adalah pelajaran R Academy gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar R Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus R Academy mencakup 4 pelajaran total.
Melakukan Iterasi pada Beberapa Masukan
map() melakukan iterasi pada satu masukan setiap kali. Namun, banyak fungsi memerlukan dua atau lebih masukan paralel. map2() dari purrr menangani dua masukan, sedangkan pmap() menangani jumlah masukan berapa pun. Keduanya tetap menjamin nilai keluaran bertipe aman.
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() — Dua Masukan Paralel
map2(.x, .y, .f) menerapkan .f(x_i, y_i) pada elemen yang bersesuaian dari .x dan .y. Kedua vektor harus memiliki panjang yang sama (atau salah satunya memiliki panjang 1 dan didaur ulang). Fungsi ini mengembalikan daftar.
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() dengan Singkatan ~
Singkatan formula ~expr juga bekerja dengan map2(): .x merujuk pada masukan pertama dan .y merujuk pada masukan kedua. Dengan demikian, fungsi anonim dengan dua argumen tetap ringkas.
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, ']'))Varian map2() Bertipe
Seperti map(), map2() memiliki varian bertipe untuk menghasilkan keluaran yang aman secara tipe: map2_dbl(), map2_chr(), map2_lgl(), map2_int(), dan map2_df(). Gunakan varian yang sesuai dengan tipe keluaran yang Anda harapkan.
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() — Jumlah Masukan Berapa Pun
pmap(.l, .f) menerima daftar vektor sebagai argumen pertamanya. Setiap vektor merupakan aliran masukan yang terpisah. Fungsi menerima elemen yang bersesuaian dari semua aliran masukan secara bersamaan.
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() dengan Bingkai Data
Bingkai data adalah daftar kolom, sehingga Anda dapat langsung meneruskan bingkai data sebagai argumen pertama ke pmap(). Fungsi menerima nilai dari satu baris sebagai argumen bernama, dengan mencocokkan nama kolom dengan nama parameter.
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)Melakukan Iterasi pada Kisi Parameter
Salah satu penggunaan umum pmap() adalah melakukan iterasi pada kisi parameter model. Gunakan expand.grid() atau tidyr::expand_grid() untuk membuat kombinasi parameter, lalu gunakan pmap() untuk menjalankan eksperimen pada setiap baris.
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() — Membangun Bingkai Data
map2_df() (atau map2_dfr()) menerapkan fungsi pada dua masukan paralel dan menggabungkan bingkai data yang dihasilkan berdasarkan baris. Cara ini sangat berguna untuk membandingkan dua kumpulan item atau menggabungkan kumpulan data paralel.
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')Menggabungkan pmap() dengan nest()
Memasangkan pmap() dengan bingkai data bertingkat dan parameter model memungkinkan pola yang kuat: simpan hiperparameter dan data dalam satu bingkai data, lalu gunakan pmap() pada baris-barisnya untuk menyesuaikan model dengan setiap kumpulan parameter.
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)Penanganan Galat dengan possibly()
Dalam alur kerja map2()/pmap(), satu masukan yang bermasalah dapat menggagalkan seluruh operasi. Bungkus fungsi Anda dengan possibly(fn, otherwise=NA) untuk menangkap galat dan mengembalikan nilai bawaan, sehingga alur kerja tetap berjalan meskipun beberapa masukan gagal.
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)Praktik: Validasi Silang dengan pmap()
Salah satu penerapan praktis pmap() adalah menjalankan validasi silang k-lipatan dengan melakukan iterasi pada penetapan lipatan. pmap() mengirimkan data pelatihan dan pengujian dari setiap lipatan ke fungsi penyesuaian model, lalu mengembalikan metrik kinerja untuk setiap lipatan.
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))Pemeriksaan Singkat
Fungsi purrr mana yang tepat untuk melakukan iterasi pada lebih dari dua vektor masukan paralel secara bersamaan?
Rangkuman: map2() dan pmap()
Hal-hal penting tentang pemetaan dengan banyak masukan:
map2(.x, .y, .f)— melakukan iterasi pada dua masukan paralel;.xdan.ydigunakan dalam singkatan~map2_dbl/chr/lgl/int/df()— varian bertipe untuk keluaran yang aman secara tipepmap(.l, .f)— melakukan iterasi pada daftar yang berisi vektor dalam jumlah berapa pun secara bersamaan- Meneruskan bingkai data ke
pmap()— nama kolom menjadi nama parameter fungsi - Gunakan
expand.grid()+pmap()untuk pencarian kisi parameter - Bungkus fungsi dengan
possibly(fn, NA)untuk penanganan galat yang aman
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)
})Belajar R dengan tutor AI — gratis
Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.
- Kursus
- 43
- Pelajaran
- 159
Pertanyaan yang Sering Diajukan
Apakah pelajaran “map2() dan pmap() untuk Banyak Input” gratis?
Ya — teks lengkap “map2() dan pmap() untuk Banyak Input” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus R Academy, upgrade ke CoddyKit PRO. Kursus R Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “map2() dan pmap() untuk Banyak Input”?
Lakukan iterasi pada dua atau lebih daftar secara bersamaan dengan map2() dan pmap(). Kamu berlatih R Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai R Academy?
Tidak diperlukan pengalaman sebelumnya. R Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.
Berapa lama pelajaran “map2() dan pmap() untuk Banyak Input” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran R Academy ini?
Ya. Setiap pelajaran R Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- map() dan Variasi Bertipe
- map2() dan pmap() untuk Banyak Input
- reduce(), accumulate(), dan walk()
- keep(), discard(), dan Penyaringan Daftar