R Academy · บทเรียน

map2() และ pmap() สำหรับอินพุตหลายรายการ

วนซ้ำรายการตั้งแต่สองรายการขึ้นไปพร้อมกันด้วย map2() และ pmap()

บทเรียน 2 จาก 413 ขั้นตอน

map2() และ pmap() สำหรับอินพุตหลายรายการ เป็นบทเรียน R Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน R Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส R Academy มีบทเรียนทั้งหมด 4 บทเรียน

การวนซ้ำผ่านข้อมูลนำเข้าหลายชุด

map() วนซ้ำผ่านข้อมูลนำเข้าทีละชุด แต่ฟังก์ชันจำนวนมากต้องใช้ข้อมูลนำเข้าคู่ขนานตั้งแต่สองชุดขึ้นไป map2() ของ purrr จัดการข้อมูลนำเข้าสองชุด ส่วน pmap() จัดการได้ไม่จำกัดจำนวน ทั้งสองฟังก์ชันยังคงรับประกันการคืนค่าชนิดเดิมอย่างปลอดภัย

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() — ข้อมูลนำเข้าคู่ขนานสองชุด

map2(.x, .y, .f) ใช้ .f(x_i, y_i) กับองค์ประกอบที่สอดคล้องกันของ .x และ .y เวกเตอร์ทั้งสองต้องมีความยาวเท่ากัน (หรือเวกเตอร์หนึ่งมีความยาว 1 และถูกนำมาใช้ซ้ำ) โดยคืนค่าเป็นรายการ

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() กับรูปแบบย่อ ~

รูปแบบย่อของสูตร ~expr ใช้กับ map2() ได้ โดย .x หมายถึงข้อมูลนำเข้าชุดแรก และ .y หมายถึงชุดที่สอง วิธีนี้ทำให้ฟังก์ชันไม่ระบุชื่อที่รับอาร์กิวเมนต์สองตัวมีความกระชับ

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, ']'))

รูปแบบ map2() ที่ระบุชนิด

เช่นเดียวกับ map() map2() มีรูปแบบที่ระบุชนิดเพื่อให้คืนค่าได้อย่างปลอดภัยตามชนิด ได้แก่ map2_dbl(), map2_chr(), map2_lgl(), map2_int() และ map2_df() โปรดเลือกรูปแบบที่ตรงกับชนิดผลลัพธ์ที่คาดหวัง

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() — ข้อมูลนำเข้าจำนวนเท่าใดก็ได้

pmap(.l, .f) รับรายการของเวกเตอร์เป็นอาร์กิวเมนต์ตัวแรก เวกเตอร์แต่ละตัวเป็นกระแสข้อมูลนำเข้าแยกกัน ฟังก์ชันจะได้รับองค์ประกอบที่สอดคล้องกันจากกระแสข้อมูลนำเข้าทั้งหมดพร้อมกัน

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() กับกรอบข้อมูล

กรอบข้อมูลคือรายการของคอลัมน์ ดังนั้นคุณจึงส่งกรอบข้อมูลเป็นอาร์กิวเมนต์ตัวแรกให้ pmap() ได้ ฟังก์ชันจะได้รับค่าของหนึ่งแถวเป็นอาร์กิวเมนต์ที่มีชื่อ โดยจับคู่ชื่อคอลัมน์กับชื่อพารามิเตอร์

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)

การวนผ่านตารางพารามิเตอร์

การใช้งาน pmap() ที่พบบ่อยคือการวนผ่านตารางพารามิเตอร์ของแบบจำลอง ใช้ expand.grid() หรือ tidyr::expand_grid() เพื่อสร้างชุดค่าผสมของพารามิเตอร์ จากนั้นใช้ pmap() เพื่อทำการทดลองกับแต่ละแถว

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() — การสร้างกรอบข้อมูล

map2_df() (หรือ map2_dfr()) ใช้ฟังก์ชันกับข้อมูลนำเข้าคู่ขนานสองชุด แล้วนำกรอบข้อมูลผลลัพธ์มาต่อกันตามแถว วิธีนี้มีประโยชน์มากสำหรับการเปรียบเทียบรายการสองชุดหรือการผสานชุดข้อมูลคู่ขนาน

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() ร่วมกับ nest()

การใช้ pmap() คู่กับกรอบข้อมูลแบบซ้อนและพารามิเตอร์ของแบบจำลอง ทำให้เกิดรูปแบบการทำงานที่มีประสิทธิภาพ: จัดเก็บไฮเปอร์พารามิเตอร์และข้อมูลไว้ในกรอบข้อมูลเดียว แล้วใช้ pmap() กับแต่ละแถวเพื่อฝึกแบบจำลองด้วยชุดพารามิเตอร์แต่ละชุด

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)

การจัดการข้อผิดพลาดด้วย possibly()

ในกระบวนการทำงานของ map2()/pmap() ข้อมูลนำเข้าที่ไม่ถูกต้องเพียงชุดเดียวอาจทำให้การทำงานทั้งหมดหยุดลงได้ ห่อฟังก์ชันด้วย possibly(fn, otherwise=NA) เพื่อดักจับข้อผิดพลาดและคืนค่าเริ่มต้น ทำให้กระบวนการทำงานต่อเนื่องยังทำงานได้แม้ข้อมูลนำเข้าบางชุดจะล้มเหลว

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)

ภาคปฏิบัติ: การตรวจสอบข้ามกลุ่มด้วย pmap()

การประยุกต์ใช้ pmap() ในทางปฏิบัติคือการทำการตรวจสอบข้ามกลุ่มแบบ k กลุ่ม โดยวนผ่านการกำหนดกลุ่ม pmap() จะส่งข้อมูลฝึกและข้อมูลทดสอบของแต่ละกลุ่มไปยังฟังก์ชันฝึกแบบจำลอง และคืนค่าตัวชี้วัดประสิทธิภาพสำหรับแต่ละกลุ่ม

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))

ตรวจสอบอย่างรวดเร็ว

ฟังก์ชัน purrr ใดเหมาะสำหรับการวนผ่านเวกเตอร์ข้อมูลนำเข้าคู่ขนานมากกว่าสองชุดพร้อมกัน

สรุป: map2() และ pmap()

ประเด็นสำคัญของการ map ด้วยข้อมูลนำเข้าหลายชุด:

  • map2(.x, .y, .f) — วนผ่านข้อมูลนำเข้าคู่ขนานสองชุด โดยใช้ .x และ .y ในรูปแบบย่อ ~
  • map2_dbl/chr/lgl/int/df() — รูปแบบที่ระบุชนิดเพื่อให้คืนค่าได้อย่างปลอดภัยตามชนิด
  • pmap(.l, .f) — วนผ่านรายการเวกเตอร์จำนวนเท่าใดก็ได้พร้อมกัน
  • ส่งกรอบข้อมูลให้ pmap() — ชื่อคอลัมน์จะกลายเป็นชื่อพารามิเตอร์ของฟังก์ชัน
  • ใช้ expand.grid() + pmap() สำหรับค้นหาจากตารางพารามิเตอร์
  • ห่อฟังก์ชันด้วย possibly(fn, NA) เพื่อจัดการข้อผิดพลาดอย่างปลอดภัย
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)
})
เริ่มต้นได้ฟรี

เรียนรู้ R ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
43
บทเรียน
159

คำถามที่พบบ่อย

บทเรียน “map2() และ pmap() สำหรับอินพุตหลายรายการ” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “map2() และ pmap() สำหรับอินพุตหลายรายการ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส R Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส R Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “map2() และ pmap() สำหรับอินพุตหลายรายการ”

วนซ้ำรายการตั้งแต่สองรายการขึ้นไปพร้อมกันด้วย map2() และ pmap() คุณปฏิบัติ R Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน R Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน R Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “map2() และ pmap() สำหรับอินพุตหลายรายการ” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน R Academy นี้ได้ไหม

ได้ บทเรียน R Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. map() และรูปแบบที่ระบุชนิด
  2. map2() และ pmap() สำหรับอินพุตหลายรายการ
  3. reduce(), accumulate() และ walk()
  4. keep(), discard() และการกรองรายการ
← กลับไปที่ R Academy