map() และรูปแบบที่ระบุชนิด
ใช้ฟังก์ชันกับรายการด้วย map(), map_dbl(), map_chr() และ map_lgl()
map() และรูปแบบที่ระบุชนิด เป็นบทเรียน R Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน R Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส R Academy มีบทเรียนทั้งหมด 4 บทเรียน
การเขียนโปรแกรมเชิงฟังก์ชันด้วย purrr
แพ็กเกจ purrr มีเครื่องมือสำหรับการเขียนโปรแกรมเชิงฟังก์ชันใน R ที่สอดคล้องกันและปลอดภัยด้านชนิดข้อมูล แทนที่จะเขียนลูป for คุณสามารถแมปฟังก์ชันกับรายการหรือเวกเตอร์ได้ ผลลัพธ์คือโค้ดที่สะอาดขึ้น เข้าใจเหตุผลได้ง่ายขึ้น และนำมาประกอบกันได้ง่าย
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() — ส่งคืนรายการเสมอ
map(.x, .f) ใช้ฟังก์ชัน .f กับสมาชิกแต่ละตัวของ .x และส่งคืนเป็นรายการ อินพุตอาจเป็นรายการ เวกเตอร์ หรือ data frame (โดยจะวนซ้ำตามคอลัมน์) นี่คือรูปแบบ map ที่ใช้งานได้ทั่วไปที่สุด
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() — ส่งคืนเวกเตอร์ตัวเลข
map_dbl(.x, .f) ใช้ .f กับ .x และส่งคืนเป็นเวกเตอร์ตัวเลข (double) หากผลลัพธ์ใดไม่ใช่ค่าตัวเลขเดี่ยว ฟังก์ชันจะส่งข้อผิดพลาดออกมา ความปลอดภัยด้านชนิดข้อมูลนี้ช่วยตรวจจับจุดบกพร่องได้ตั้งแต่เนิ่น ๆ
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() — ส่งคืนเวกเตอร์อักขระ
map_chr(.x, .f) แมปค่าและส่งคืนเป็นเวกเตอร์อักขระ เหมาะสำหรับดึงแอตทริบิวต์ที่เป็นสตริง จัดรูปแบบผลลัพธ์ หรือสร้างเส้นทางไฟล์ ฟังก์ชันต้องส่งคืนสตริงหนึ่งค่าในแต่ละสมาชิก
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() — ส่งคืนเวกเตอร์ตรรกะ
map_lgl(.x, .f) ส่งคืนเวกเตอร์ตรรกะที่ประกอบด้วยค่า TRUE/FALSE เหมาะอย่างยิ่งสำหรับทดสอบเงื่อนไขกับรายการ เช่น ตรวจสอบว่าสมาชิกใดตรงตามเกณฑ์
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() — ส่งคืนเวกเตอร์จำนวนเต็ม
map_int(.x, .f) ส่งคืนเวกเตอร์จำนวนเต็ม ใช้เมื่อฟังก์ชันของคุณส่งคืนจำนวน ดัชนี หรือผลลัพธ์อื่น ๆ ที่เป็นจำนวนเต็ม หมายเหตุ: ใน R ฟังก์ชัน length() และ nrow() จะส่งคืนค่าจำนวนเต็ม
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() — คืนค่ากรอบข้อมูล
map_df(.x, .f) (ชื่อเรียกแทน: map_dfr()) ใช้ .f กับแต่ละองค์ประกอบ แล้วนำผลลัพธ์มาต่อกันตามแถวเป็นกรอบข้อมูลเดียว ฟังก์ชันต้องคืนค่ากรอบข้อมูลหรือ tibble สำหรับแต่ละองค์ประกอบ ส่วน map_dfc() จะนำผลลัพธ์มาต่อกันตามคอลัมน์แทน
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
)
})ฟังก์ชันไม่ระบุชื่อด้วย ~
purrr รองรับรูปแบบย่อของสูตรสำหรับฟังก์ชันไม่ระบุชื่อ: ~expr โดย .x หมายถึงองค์ประกอบปัจจุบัน รูปแบบนี้ช่วยไม่ต้องเขียน function(x) expr และทำให้โค้ดกระชับ ทั้งสองรูปแบบทำงานเหมือนกัน
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)การวนผ่านรายการที่มีชื่อ
เมื่อ .x เป็นรายการหรือเวกเตอร์ที่มีชื่อ ผลลัพธ์จาก map() จะคงชื่อเหล่านั้นไว้ map_dbl() และรูปแบบที่ระบุชนิดอื่น ๆ จะส่งต่อชื่อไปด้วย ทำให้ผลลัพธ์อธิบายตัวเองได้
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)การใช้ map() กับคอลัมน์ของกรอบข้อมูล
กรอบข้อมูลคือรายการของคอลัมน์ ดังนั้น map(df, fn) จะใช้ fn กับแต่ละคอลัมน์ เมื่อใช้ร่วมกับ map_dbl() จะเป็นวิธีกระชับในการคำนวณค่าสถิติสำหรับทุกคอลัมน์พร้อมกัน
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)การซ้อนการเรียก map()
คุณสามารถซ้อนการเรียก map() เพื่อวนซ้ำหลายระดับได้ — map ชั้นนอกวนผ่านกลุ่ม และ map ชั้นในวนผ่านพารามิเตอร์ วิธีนี้แทนที่ลูป for ที่ซ้อนกันด้วยโครงสร้างที่สะอาดและประกอบต่อได้ง่าย เพื่อให้อ่านง่าย ควรจำกัดความลึกของการซ้อนไว้ที่ 2 ระดับ
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))
})ตรวจสอบอย่างรวดเร็ว
ความแตกต่างสำคัญระหว่าง map() และ map_dbl() คืออะไร
สรุป: map() และรูปแบบที่ระบุชนิด
ประเด็นสำคัญของ map() และรูปแบบที่ระบุชนิด:
map(.x, .f)— คืนค่าเป็นรายการเสมอ ยืดหยุ่นที่สุดmap_dbl()— คืนค่าเป็นเวกเตอร์ตัวเลข และเกิดข้อผิดพลาดเมื่อชนิดไม่ถูกต้องmap_chr()— คืนค่าเป็นเวกเตอร์อักขระmap_lgl()— คืนค่าเป็นเวกเตอร์ตรรกะmap_int()— คืนค่าเป็นเวกเตอร์จำนวนเต็มmap_df()/map_dfr()— นำผลลัพธ์มาต่อกันตามแถวเป็นกรอบข้อมูล- รูปแบบย่อ
~.x— ไวยากรณ์กระชับสำหรับฟังก์ชันไม่ระบุชื่อ - ข้อมูลนำเข้าที่มีชื่อจะสร้างผลลัพธ์ที่มีชื่อโดยอัตโนมัติ
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')เรียนรู้ R ด้วย AI tutor — ฟรี
เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป
- คอร์ส
- 43
- บทเรียน
- 159
คำถามที่พบบ่อย
บทเรียน “map() และรูปแบบที่ระบุชนิด” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “map() และรูปแบบที่ระบุชนิด” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส R Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส R Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “map() และรูปแบบที่ระบุชนิด”
ใช้ฟังก์ชันกับรายการด้วย map(), map_dbl(), map_chr() และ map_lgl() คุณปฏิบัติ R Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน R Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน R Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “map() และรูปแบบที่ระบุชนิด” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน R Academy นี้ได้ไหม
ได้ บทเรียน R Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- map() และรูปแบบที่ระบุชนิด
- map2() และ pmap() สำหรับอินพุตหลายรายการ
- reduce(), accumulate() และ walk()
- keep(), discard() และการกรองรายการ