0Pricing
R Academy · درس

التقييم المنظّم: {{ }} و.data

اكتب دوال dplyr تقبل أسماء الأعمدة كوسائط بأمان.

التقييم المنظّم: {{ }} و.data درس مجاني في R Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في R Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة R Academy 4 دروس في المجموع.

المشكلة: البرمجة باستخدام dplyr

تستخدم dplyr التقييم غير القياسي (NSE) — إذ تُمرَّر أسماء الأعمدة دون وضعها بين علامتي اقتباس. وهذا مريح عند العمل التفاعلي، لكنه قد يكون معقداً عند كتابة الدوال. كيف تمررون اسم عمود كمتغير إلى دالة في dplyr؟

library(dplyr)

df <- data.frame(x=1:5, y=c(2,4,6,8,10))

# Works fine interactively:
df %>% summarize(mean_x = mean(x))

# But what if 'x' is a variable?
col_name <- 'x'
# df %>% summarize(result = mean(col_name))  # WRONG! treats 'col_name' as column
cat('Need tidy evaluation to solve this!')

عامل الاحتواء {{ }}

داخل الدالة، استخدموا {{ col_var }}، ويُسمى هذا العامل «curly-curly» أو «embrace»، لتمرير اسم عمود سيُقيَّم ضمن سياق إطار البيانات. وهذا هو الأسلوب الموصى به لمعظم برمجة الدوال في dplyr.

library(dplyr)

df <- data.frame(
  group = c('A','A','B','B'),
  sales = c(100, 120, 200, 180),
  costs = c(60, 70, 110, 90)
)

# Function using {{ }}
group_mean <- function(data, group_col, value_col) {
  data %>%
    group_by({{ group_col }}) %>%
    summarize(mean_val = mean({{ value_col }}), .groups = 'drop')
}

group_mean(df, group, sales)
group_mean(df, group, costs)

استخدام {{ }} لأسماء الأعمدة في الناتج

يمكنكم أيضاً استخدام {{ }} على الجانب الأيسر من := لتسمية أعمدة الناتج ديناميكياً. يتيح العامل :=، المعروف بعامل walrus، استخدام أسماء متغيرات على يسار عمليات الإسناد داخل أفعال dplyr.

library(dplyr)

df <- data.frame(a=1:4, b=c(2,4,6,8))

# Dynamic output column name
compute_mean <- function(data, col) {
  col_name <- paste0('mean_', deparse(substitute(col)))
  data %>% summarize('{col_name}' := mean({{ col }}))
}

compute_mean(df, a)
compute_mean(df, b)

ضمير .data

يتيح .data[['col_name']] تحديد عمود باستخدام متغير نصي. وهو يخبر dplyr صراحةً بالبحث عن العمود في إطار البيانات الحالي. ويفيد ذلك عندما تكون أسماء الأعمدة مخزنة كسلاسل محارف.

library(dplyr)

df <- data.frame(
  name = c('Alice','Bob','Carol'),
  score = c(85, 92, 78),
  grade = c('B','A','C')
)

# Using .data with a string variable
get_summary <- function(data, col_name) {
  data %>%
    summarize(
      n = n(),
      mean_val = mean(.data[[col_name]])
    )
}

get_summary(df, 'score')

across() — التطبيق على أعمدة متعددة

تطبّق across(cols, fns)، عند استخدامها داخل mutate() أو summarize()، دالةً على عدة أعمدة دفعة واحدة. حدّدوا الأعمدة باستخدام أدوات tidyselect المساعدة مثل: starts_with() وwhere(is.numeric) وeverything() وغيرها.

library(dplyr)

df <- data.frame(
  id = 1:3,
  sales_q1 = c(100, 200, 150),
  sales_q2 = c(120, 180, 160),
  cost_q1 = c(60, 110, 80),
  cost_q2 = c(70, 100, 85)
)

# Summarize all numeric columns except 'id'
df %>%
  summarize(across(where(is.numeric) & !id, mean))

استخدام across() مع دوال مسماة

مرّروا قائمة مسماة من الدوال إلى across() لحساب عدة إحصاءات لكل عمود. وتُسمّى أعمدة الناتج وفق الصيغة col_fn. استخدموا .names لتخصيص نمط التسمية.

library(dplyr)

df <- data.frame(
  x = c(10, 20, 30, 40),
  y = c(5, 15, 25, 35)
)

# Compute mean and sd for both columns
df %>%
  summarize(across(
    c(x, y),
    list(mean = mean, sd = sd),
    .names = '{.col}_{.fn}'
  ))

استخدام across() في mutate()

يؤدي استخدام across() داخل mutate() إلى تحويل عدة أعمدة في الوقت نفسه. وبذلك تتجنبون تكرار التحويل نفسه لكل عمود على حدة.

library(dplyr)

df <- data.frame(
  id = 1:3,
  revenue = c(1000, 2000, 1500),
  cost = c(600, 1100, 800),
  tax = c(100, 200, 150)
)

# Round all numeric columns except id to nearest 10
df %>%
  mutate(across(where(is.numeric) & !id,
                ~round(., -2)))

pick() — تحديد أعمدة للعمليات

تحدد pick()، المتاحة في dplyr 1.1+، مجموعةً فرعية من الأعمدة على هيئة إطار بيانات مصغر، وهو ما يفيد عند تمريرها إلى دوال تتوقع إطار بيانات. وتعمل داخل mutate() وsummarize().

library(dplyr)

df <- data.frame(
  id = 1:3,
  a = c(1, 2, 3),
  b = c(4, 5, 6),
  c_val = c(7, 8, 9)
)

# Use pick() to compute row-wise mean across selected columns
df %>%
  mutate(
    row_mean = rowMeans(pick(a, b, c_val)),
    row_max = do.call(pmax, pick(a, b, c_val))
  )

كتابة دوال dplyr قابلة لإعادة الاستخدام

يتيح الجمع بين {{ }} و.data[[]] وacross() كتابة دوال تحليل قوية قابلة لإعادة الاستخدام. والنمط الأساسي هو: قبول أسماء الأعمدة كوسائط غير محاطة بعلامات اقتباس (باستخدام {{ }}) أو كسلاسل نصية (باستخدام .data[[]]).

library(dplyr)

df <- data.frame(
  region = c('East','East','West','West'),
  product = c('A','B','A','B'),
  revenue = c(100, 200, 150, 250),
  units = c(10, 15, 12, 20)
)

# Flexible grouped summary function
group_stats <- function(data, ..., metric) {
  data %>%
    group_by(...) %>%
    summarize(
      total = sum({{ metric }}),
      average = mean({{ metric }}),
      .groups = 'drop'
    )
}

group_stats(df, region, metric = revenue)
group_stats(df, region, product, metric = units)

أدوات التحديد المنظم

تعمل أدوات tidyselect المساعدة داخل across() وselect() وpick(): starts_with() وends_with() وcontains() وmatches() وnum_range() وwhere(predicate) وeverything().

library(dplyr)

df <- data.frame(
  id = 1:3,
  score_2022 = c(80,85,90),
  score_2023 = c(82,88,91),
  score_2024 = c(85,90,93),
  category = c('A','B','A')
)

# Select all score columns and compute their means
df %>%
  summarize(
    across(starts_with('score'), mean),
    n = n()
  )

دمج أنماط التقييم المنظم

غالباً ما تدمج دوال dplyr الواقعية بين {{ }} لمتغيرات التجميع، وacross() لمقاييس متعددة، و.data[[]] لأسماء الأعمدة النصية. ويساعدكم فهم وقت استخدام كل نمط على جعل التعليمات البرمجية مرنة وصحيحة.

library(dplyr)

df <- data.frame(
  dept = c('HR','HR','Eng','Eng'),
  salary = c(60000, 65000, 100000, 110000),
  bonus = c(5000, 6000, 15000, 18000)
)

# String-based column selection with .data
summarize_column <- function(data, group_col, value_col_name) {
  data %>%
    group_by(.data[[group_col]]) %>%
    summarize(
      mean = mean(.data[[value_col_name]]),
      total = sum(.data[[value_col_name]]),
      .groups = 'drop'
    )
}

summarize_column(df, 'dept', 'salary')
summarize_column(df, 'dept', 'bonus')

تحقق سريع

داخل دالة مخصصة، ما الطريقة الصحيحة لتمرير اسم عمود كوسيط غير محاط بعلامات اقتباس إلى dplyr؟

مراجعة: التقييم المنظم

أهم النقاط المتعلقة بالبرمجة باستخدام dplyr:

  • {{ col }} — احتواء وسائط أسماء الأعمدة غير المحاطة بعلامات اقتباس في الدوال
  • .data[['col_name']] — الوصول إلى الأعمدة باستخدام اسم متغير نصي
  • := عامل walrus — يُستخدم مع {{ }} أو سلاسل glue لأسماء الناتج الديناميكية
  • across(cols, fns) — تطبيق دالة أو عدة دوال على عدة أعمدة دفعة واحدة
  • pick(cols) — تحديد الأعمدة كإطار بيانات فرعي للعمليات الصفية
  • أدوات tidyselect المساعدة: starts_with() وwhere() وcontains() وeverything()
library(dplyr)

df <- data.frame(
  group = c('A','A','B','B'),
  v1 = c(10, 20, 30, 40),
  v2 = c(5, 15, 25, 35)
)

# Reusable function using {{ }} + across
group_summary <- function(data, grp) {
  data %>%
    group_by({{ grp }}) %>%
    summarize(across(where(is.numeric), list(mean=mean, sum=sum)), .groups='drop')
}

group_summary(df, group)

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

هل درس «التقييم المنظّم: {{ }} و.data» مجاني؟

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

ماذا ستتعلم في «التقييم المنظّم: {{ }} و.data»؟

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

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

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

كم من الوقت يستغرق درس «التقييم المنظّم: {{ }} و.data»؟

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

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

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

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

  1. الملخّصات المجمّعة وgroup_by()
  2. دوال النوافذ: lag وlead وcumsum
  3. الربط بين جداول متعددة في dplyr
  4. التقييم المنظّم: {{ }} و.data
← العودة إلى R Academy