R: المُشغِّلات في لغة R
آخر تحديث: 2026-08-26
في الدرس السابق، تعرفنا على المتجهات وأنواع البيانات. في هذا الدرس، سنتعمق في «أساسيات» البرمجة بلغة R، ألا وهي المُشغِّلات. فجميع برامج R — بدءًا من الحسابات البسيطة وصولاً إلى النماذج الإحصائية المعقدة — تعتمد في جوهرها على المُشغِّلات.
مجموعة العوامل الحسابية في لغة R تشبه إلى حد كبير تلك الموجودة في اللغات الأخرى، ولكن هناك تفصيلين صغيرين يقتصران على لغة R: القسمة الصحيحة %% %/% وسلوك «البث» المتجهي. في هذا الدرس، سنستعرض جميع العوامل الحسابية بشكل شامل.
1. ما ستتعلمه
- الفئات الأربع الرئيسية للمُشغِّلات الحسابية (العمليات الأساسية + القسمة الصحيحة + العمليات المتجهة)
- 3 أنواع من عوامل المقارنة (المقارنة العددية + المقارنة النصية + القيم الخاصة)
- 3 أنواع من العوامل المنطقية (AND، OR، NOT + التقييم المختصر)
- 5 عوامل R فريدة (
%in%%*%%/%%%:) - أولوية العمليات الحسابية (تجنب التعبيرات الغامضة)
- الأخطاء الحسابية الشائعة في التطبيقات العملية
2. قصة عن عملية حسابية مالية
(1) المشكلة: حساب الأرباح يدويًّا
بوب محاسب، وفي نهاية الشهر، يتعين عليه إعداد «تقرير مبيعات الفرع» لمديره:
لدى الشركة 5 فروع، وتبلغ مبيعات كل فرع هذا الشهر
120, 150, 80, 200, 175عشرة آلاف يوان. احسب:
- إجمالي المبيعات، متوسط المبيعات
- ربح كل متجر (المبيعات × هامش ربح 30٪)
- ما هي المتاجر التي تسجل مبيعات أعلى من المتوسط (تتطلب اهتمامًا خاصًا)
- الجزء الصحيح من إجمالي الربح (بالآلاف من اليوان، مقربًا إلى الأقل)
إذا أجريت الحساب يدويًّا باستخدام آلة حاسبة، فسيستغرق الأمر 5 دقائق؛ أما باستخدام برنامج «إكسل»، فعليك إنشاء جدول بيانات وإدخال الصيغ؛ أما باستخدام لغة البرمجة «R»—
(2) الحل باستخدام لغة R
# 5 Sales at each branch(10,000 yuan)
sales <- c(120, 150, 80, 200, 175)
# All calculations are completed with a single line of code
total_sales <- sum(sales) # Total Sales 725
avg_sales <- mean(sales) # Average 145
profit <- sales * 0.3 # Profit Vector
high_sales <- sales[sales > avg_sales] # Branches with Above-Average Performance
profit_int <- profit %/% 1 # Integer Profit(Integer Division)
cat("Total Sales:", total_sales, "10,000 yuan\n")
cat("Average Sales:", avg_sales, "10,000 yuan\n")
cat("Total Profit(Integer):", sum(profit_int), "10,000 yuan\n")
cat("Above-average sales at branch locations:", high_sales, "\n")
10 أسطر من التعليمات البرمجية لحل 5 مهام حسابية. هذه هي قوة عامل R — سطر واحد من التعليمات البرمجية يعادل متجهًا من العمليات.
3. العوامل الحسابية: العمليات الحسابية
(1) العوامل الحسابية الأساسية
| المشغل | المعنى | مثال | النتيجة |
|---|---|---|---|
+ |
إضافة | 2 + 3 |
5 |
- |
انخفاض | 5 - 2 |
3 |
* |
الضرب | 4 * 3 |
12 |
/ |
حذف | 7 / 2 |
3.5 |
^ أو ** |
الطاقة | 2 ^ 3 |
8 |
%% |
الطرح (الباقي) | 7 %% 2 |
1 |
%/% |
القسمة الصحيحة | 7 %/% 2 |
3 |
(2) القسمة الصحيحة: خاص بـ R
# 7 / 2 = 3.5(Ordinary Division)
7 / 2
# [1] 3.5
# 7 %/% 2 = 3(Integer Division,Round down)
7 %/% 2
# [1] 3
# 7 %% 2 = 1 (Modulo, Remainder)
7 %% 2
# [1] 1
# Practical Application: Convert seconds to "hr:min:s"
total_seconds <- 3725
hours <- total_seconds %/% 3600
minutes <- (total_seconds %% 3600) %/% 60
seconds <- total_seconds %% 60
cat(hours, "hr", minutes, "min", seconds, "s\n")
# 1 hr 2 min 5 s
%% و%/% شائعة جدًّا في معالجة البيانات: ترقيم الصفحات (page %/% page_size)، والتجميع (id %% 10 — التقسيم إلى 10 مجموعات بناءً على الرقم الأخير)، وتحويل الوحدات الزمنية.
(3) العمليات على المتجهات (نقطة أساسية)
يتم تنفيذ العمليات الحسابية في R بشكل متجه افتراضيًا — وهذه إحدى نقاط القوة الأساسية في R:
graph LR
A["x = 1, 2, 3"] --> C["+ 10"]
C --> D["11, 12, 13"]
E["x = 1, 2, 3"] --> F["+ y = 10, 20, 30"]
F --> G["11, 22, 33"]
style A fill:#cce5ff
style C fill:#d4edda
style D fill:#d4edda
# Vector + Scalar(Scalar"Broadcast"Go to each element)
c(1, 2, 3) + 10
# [1] 11 12 13
# Vector + Vector(Element-wise Operations)
c(1, 2, 3) + c(10, 20, 30)
# [1] 11 22 33
# When the lengths are different,"Loop"
c(1, 2, 3, 4) + c(10, 20)
# Warning: longer object length is not a multiple of shorter object length
# [1] 11 22 13 24
(4) الدوال الرياضية الشائعة
| الوظيفة | الغرض | مثال |
|---|---|---|
abs() |
القيمة المطلقة | abs(-5) → 5 |
sqrt() |
الجذر التربيعي | sqrt(16) → 4 |
| اللوغاريتم الطبيعي | → | |
log10() |
اللوغاريتم العادي | log10(1000) → 3 |
log2() |
القاعدة 2 | log2(8) → 3 |
exp() |
x أس e | exp(1) → 2.718 |
| التجميع | round() |
|
floor() |
التقريب إلى الأقل | floor(3.7) → 3 |
| ملخص | ceiling() |
ceiling(3.2) → 4 |
4. عوامل المقارنة: تقييم «صحيح/خطأ»
(1) 6 عوامل المقارنة
| المشغل | المعنى | مثال | النتيجة |
|---|---|---|---|
== |
يساوي | 5 == 5 |
TRUE |
!= |
لا يساوي | 5 != 3 |
TRUE |
< |
أصغر من | 3 < 5 |
TRUE |
> |
أكبر من | 5 > 3 |
TRUE |
<= |
أقل من أو يساوي | 5 <= 5 |
TRUE |
>= |
أكبر من أو يساوي | 5 >= 6 |
FALSE |
(2) ⚠️ خطأ شائع مهم: علامة التساوي المفردة مقابل علامتي التساوي المزدوجتين
# Single = It is an assignment
x = 5
# Double equal sign == It is a comparison
x == 5
# [1] TRUE
==؛ لا تستخدم =. لن يُظهر R خطأً من نوع "=`" (لأنها عملية تعيين صحيحة)، لكن النتيجة ستكون خاطئة تمامًا.
(3) مقارنة السلاسل (الترتيب المعجمي)
# Character by ASCII Code Comparison
"apple" < "banana"
# [1] TRUE ← 'a' Coding < 'b'
# Numeric characters cannot be compared directly for size.(Character-by-character comparison,Not by value)
"9" > "10"
# [1] TRUE <- '9' (0x39) > '1' (0x31), Not a numerical comparison!
# The Correct Way to Do It:Convert to a number
as.numeric("9") > as.numeric("10")
# [1] FALSE
(4) مقارنة القيم الخاصة
# NA The results of the comparison are NA(No TRUE/FALSE)
NA == 5
# [1] NA
# Decision NA Must use is.na()
is.na(NA)
# [1] TRUE
# NaN Comparison of
NaN == NaN
# [1] NA <- NaN == NaN is also NA!
is.na() تحديدًا للتحقق من ذلك.
5. العوامل المنطقية: الجمع بين الشروط
(1) العوامل المنطقية الأساسية الثلاثة
| المشغل | المعنى | مثال | النتيجة |
|---|---|---|---|
& |
عملية «AND» لكل عنصر على حدة | TRUE & FALSE |
FALSE |
| |
عملية «أو» لكل عنصر على حدة | TRUE | FALSE |
TRUE |
! |
إلغاء | !TRUE |
FALSE |
(2) التحويل إلى متجهات (نقطة أساسية)
x <- c(TRUE, TRUE, FALSE, FALSE)
y <- c(TRUE, FALSE, TRUE, FALSE)
# Elemental Level AND(Vectorization)
x & y
# [1] TRUE FALSE FALSE FALSE
# Elemental Level OR
x | y
# [1] TRUE TRUE TRUE FALSE
(3) تقييم الدائرة القصيرة: && و ||
| المشغل | السلوك | الغرض |
|---|---|---|
& |
عملية «AND» على كل عنصر على حدة، جميع العمليات الحسابية | العمليات المنطقية على المتجهات |
&& |
عملية «AND» بالقصير الدائرة، يُحتسب الأول فقط | شرط «if» |
| |
عملية «أو» على مستوى العناصر، جميع العمليات الحسابية | العمليات المنطقية على المتجهات |
|| |
عملية «أو» القصيرة، يُحتسب الأول فقط | شرط if |
# if Used in the conditions &&(Check only the first element)
if (x > 0 && x < 10) {
cat("x is between 0-10\n")
}
# Used in vector logic &(Check all elements)
c(1, 2, 11) > 0 & c(1, 2, 11) < 10
# [1] TRUE TRUE FALSE
if، يجب عليك استخدام && و||؛ ولا تستخدم & أو |. وإلا، فقد تحصل على نتائج غير متوقعة.
(4) تدريب عملي: التصفية باستخدام شروط مجمعة
# Find 18-30 Adults aged
ages <- c(15, 22, 28, 35, 40, 19)
adults <- ages[ages >= 18 & ages <= 30]
adults
# [1] 22 28 19
# Identify the failing or perfect scores
scores <- c(58, 60, 75, 100, 45, 90)
special <- scores[scores < 60 | scores == 100]
special
# [1] 58 100 45
6. العوامل الخاصة بلغة R
(1) 5 من أفراد القوات الخاصة
| المشغل | المعنى | مثال | النتيجة |
|---|---|---|---|
%in% |
ينتمي إلى (التحقق من العضوية) | 3 %in% c(1,2,3) |
TRUE |
%*% |
ضرب المصفوفات | matrix(1:4,2) %*% matrix(1:4,2) |
المصفوفات |
%/% |
القسمة الصحيحة | 7 %/% 2 |
3 |
%% |
إخراج القالب | 7 %% 2 |
1 |
: |
التسلسل | 1:5 |
1 2 3 4 5 |
(2) شرح مفصل لـ %in%
%in% هو المشغل «الأساسي» لتصفية البيانات:
# Is the element in the vector?
c(1, 2, 3) %in% c(2, 4, 6)
# [1] FALSE TRUE FALSE <- 1, 3 Not here; 2 is
# Practical Application: Filter "Beijing, Shanghai, and Guangzhou" City
cities <- c("Beijing", "Shanghai", "Shenzhen", "Guangzhou", "Hangzhou")
target <- c("Beijing", "Shanghai", "Guangzhou")
cities[cities %in% target]
# [1] "Beijing" "Shanghai" "Guangzhou"
(3) مقدمة في ضرب المصفوفات %*%
# Basic Multiplication(Elemental Level)
matrix(1:4, 2, 2) * matrix(1:4, 2, 2)
# [,1] [,2]
# [1,] 1 9
# [2,] 4 16
# Matrix Multiplication(Linear Algebra)
matrix(1:4, 2, 2) %*% matrix(1:4, 2, 2)
# [,1] [,2]
# [1,] 7 15
# [2,] 10 22
7. أولوية العمليات الحسابية (تجنب الغموض)
تتبع العوامل الحسابية في لغة R ترتيبًا محددًا للأولوية؛ استخدام الأقواس عند الشك هو النهج الأكثر أمانًا:
| الأولوية | المشغل | الوصف |
|---|---|---|
| عالي | ^ |
عمليات الطاقة |
| ↑ | * / |
الضرب والقسمة |
| ↑ | + - |
الجمع والطرح |
| ↑ | < <= > >= == != |
مقارنة |
| ↑ | ! |
تراجع |
| ↑ | & && |
مع |
| أو | ||
| منخفض | <- |
واجب |
# Without parentheses(By priority)
1 + 2 * 3
# [1] 7 <- 2*3=6, then +1
# Add parentheses(Clarify Intent)
(1 + 2) * 3
# [1] 9
# Be sure to use parentheses in complex expressions.
# Find 18-65 yrs
ages <- c(15, 25, 70, 30)
adults <- ages[ages >= 18 & ages <= 65] # ✅ Adding parentheses makes it clearer
8. مثال كامل: تحليل شامل لمبيعات الفروع
فيما يلي مثال على مسار عمل كامل يجمع بين جميع العوامل التي تم تناولها في هذا الدرس.
▶ مثال: تحليل شامل لمبيعات الفروع
# ============================================
# Comprehensive Analysis of Branch Sales
# Features:Analysis Using Various Operators 5 Sales Data by Branch
# ============================================
# 1. Prepare data
sales <- c(Beijing = 120, Shanghai = 150, Shenzhen = 80, Guangzhou = 200, Hangzhou = 175)
cat("Raw Sales Data(10,000 yuan):\n")
print(sales)
# 2. Arithmetic Operations:Total Sales,Average,Highest,Lowest
total <- sum(sales) # Sum
avg <- mean(sales) # Average
cat("\nTotal Sales:", total, "10,000 yuan\n")
cat("Average Sales:", avg, "10,000 yuan\n")
cat("Top Sales:", max(sales), "10,000 yuan\n")
cat("Minimum Sales:", min(sales), "10,000 yuan\n")
# 3. Arithmetic Operations:Profit(30% Profit Margin)
profit_rate <- 0.3
profit <- sales * profit_rate # Vector × Scalar
cat("\nTotal Profit:", sum(profit), "10,000 yuan\n")
# 4. Comparison + Logic:Identify branches that perform above average
is_above_avg <- sales > avg # Comparison:Which ones are above average?
cat("\nBranches with Above-Average Performance:")
print(sales[is_above_avg])
# 5. Comparison + Logic:Identify low-performing stores(< 1,000,000)
is_low <- sales < 100
cat("\nLow-Sales Stores(< 1,000,000):")
print(sales[is_low])
# 6. Integer Operations:Round Profit to the Nearest Whole Number + Grouping
profit_int <- profit %/% 1 # Integer Division(Round down)
cat("\nRound Profit to the Nearest Whole Number:")
print(profit_int)
# 7. %in% Filter
target_cities <- c("Beijing", "Shanghai", "Guangzhou")
selected <- sales[names(sales) %in% target_cities]
cat("\nSales in Target Cities:")
print(selected)
النتائج المتوقعة (مقتطف):
Raw Sales Data(10,000 yuan):
Beijing Shanghai Shenzhen Guangzhou Hangzhou
120 150 80 200 175
Total Sales: 725 10,000 yuan
Average Sales: 145 10,000 yuan
Top Sales: 200 10,000 yuan
Minimum Sales: 80 10,000 yuan
Branches with Above-Average Performance:
Guangzhou Hangzhou
200 175
Total Profit: 217.5 10,000 yuan
Low-Sales Stores(< 1,000,000):
Shenzhen
80
❓ أسئلة شائعة
%% و%/%؟%% بإجراء القسمة على أساس المودولو (تُرجع الباقي)، بينما تقوم %/% بإجراء القسمة الصحيحة (تُرجع الناتج). على سبيل المثال، 7 %/% 2 = 3 (الحاصل) و7 %% 2 = 1 (الباقي). وهذه العمليات شائعة جدًا في سيناريوهات ترقيم الصفحات وتحويل الوحدات الزمنية والتجميع.& أم &&؟& للعمليات المنطقية المتجهة (متجهة، تُقيّم جميع العناصر)؛ واستخدم && لشروط if (تقييم قصير الدائرة، يُقيّم العنصر الأول فقط). لا تميز لغة R بينهما بشكل صارم مثل اللغات الأخرى، لكن استخدام الخيار الخاطئ قد يؤدي إلى عبارات if غير صحيحة.📖 ملخص
- 4 فئات رئيسية من العوامل الحسابية: الحسابية (
+ - * / ^ %% %/%)، والمقارنة (== != < > <= >=)، والمنطقية (& \| !)، والتعيين (<- = -> <<-) - ميزات R: القسمة الصحيحة
%%%/%، سلوك «البث» المُعالج متجهياً،%in%التحقق من العضوية - متجه + عدد قياسي = يتم تطبيق العدد القياسي على كل عنصر؛ متجه + متجه = عملية على مستوى العناصر
- تتم مقارنة السلاسل بناءً على ترميز ASCII الخاص بها (وليس قيمها العددية)؛ ويجب تحويل الأحرف العددية باستخدام
as.numeric(). ifللعمليات الشرطية&&\|\|(التقييم السريع)، و&\|للمنطق المتجهي (التوجيه المتجهي)- تُعطى الأولوية للعمليات الحسابية؛ إذا كنت غير متأكد، فاستخدم الأقواس (سهولة القراءة > الإيجاز)
NA == 5والنتيجة هيNA(وليست TRUE/FALSE)؛ استخدمis.na()لتقييمها
📝 تمارين
-
المسألة الأساسية: استخدم لغة R لحساب 1+2+3+...+100 باستخدام ثلاث طرق مختلفة: ①
sum(1:100)② حلقة ③ صيغةn(n+1)/2. تحقق من تطابق النتائج التي تم الحصول عليها من الطرق الثلاث جميعها. -
تمرين أساسي: حوّل عدد الثواني
total_seconds <- 3725إلى التنسيق «ساعات:دقائق:ثوانٍ» (راجع مثال القسمة الصحيحة في هذا الدرس)، واحفظ لقطة شاشة للكود والنتيجة. -
المسألة الأساسية: استخدم
%in%لإيجاد الأعداد الزوجية في المتجهc(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)(باستخدام الطريقة الموضحة فيc(2, 4, 6, 8, 10) %in%)، ثم التقط لقطة شاشة للنتيجة. -
مشكلة متقدمة: احسب درجات 5 طلاب
scores <- c(85, 92, 78, 95, 88)باستخدام علامات المقارنة والمنطق من أجل: ① تحديد الدرجات التي تبلغ 90 أو أكثر؛ ② تحديد الدرجات التي تتراوح بين 60 و89؛ ③ حساب عدد الطلاب الذين حصلوا على درجات تبلغ 80 أو أكثر. -
التحدي: اكتب برنامجًا يستخدم
sample(1:100, 20)لتوليد 20 عددًا عشوائيًا، واحسب: ① عدد الأعداد الزوجية (%% 2 == 0)؛ ② عدد الأعداد القابلة للقسمة على 3 (%% 3 == 0)؛ ③ عدد الأرقام الزوجية والقابلة للقسمة على 3 في آن واحد (&— الشرط المركب)؛ ④ مجموع هذه الأرقام ومتوسطها.