0Pricing
R Academy · درس

map() ومتغيراته ذات الأنواع

طبّق الدوال على القوائم باستخدام map() وmap_dbl() وmap_chr() وmap_lgl().

map() ومتغيراته ذات الأنواع درس مجاني في R Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في R Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة R Academy 4 دروس في المجموع.

البرمجة الوظيفية باستخدام purrr

توفر حزمة purrr أدوات متسقة وآمنة من حيث النوع للبرمجة الوظيفية في R. بدلًا من كتابة حلقات for، تطبّق دالة باستخدام map على قائمة أو متجه. وينتج عن ذلك كود أوضح وأسهل في الفهم والتركيب.

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 وتُرجع قائمة. ويمكن أن تكون المدخلة قائمة أو متجهًا أو إطار بيانات، حيث تكرّر الدالة على الأعمدة. وهذا هو الشكل العام الأكثر استخدامًا لـ 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() لإجراء تكرار متعدد المستويات — إذ يكرّر الاستدعاء الخارجي على المجموعات، والداخلي على المعاملات. ويستبدل ذلك حلقات for المت嵌سة ببنية واضحة قابلة للتركيب. احرصوا على ألا يتجاوز عمق الت嵌يس مستويين للحفاظ على سهولة القراءة.

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

الأسئلة الشائعة

هل درس «map() ومتغيراته ذات الأنواع» مجاني؟

نعم — نص درس «map() ومتغيراته ذات الأنواع» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة R Academy، انتقل إلى CoddyKit PRO. تتضمن دورة R Academy 4 دروس في المجموع.

ماذا ستتعلم في «map() ومتغيراته ذات الأنواع»؟

طبّق الدوال على القوائم باستخدام map() وmap_dbl() وmap_chr() وmap_lgl(). تتمرن على R Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ R Academy؟

لا تُشترط خبرة سابقة. R Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.

كم من الوقت يستغرق درس «map() ومتغيراته ذات الأنواع»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس R Academy هذا؟

نعم. كل درس في R Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. map() ومتغيراته ذات الأنواع
  2. map2() وpmap() لمدخلات متعددة
  3. reduce() وaccumulate() وwalk()
  4. keep() وdiscard() وتصفية القوائم
← العودة إلى R Academy