Menu
flag Ar iconالعربيةdown icon

المعاملات في R: الحسابية والمقارنة والمنطقية و%in% و%%

كل معامل تحتاجه في R - الحسابية بما فيها %% و%/%، والمقارنات المتجهية، والفرق بين & و&&، والمعامل %in% لاختبار الانتماء.

تحتوي هذه الصفحة على محررات قابلة للتشغيل - حرّر، شغّل، وشاهد النتيجة فوراً.

المعاملات التي تمنحك إياها R

تنقسم معاملات R إلى أربع مجموعات عملية: الحسابية (+ - * / ^ %% %/%)، والمقارنة (== != < <= > >=)، والمنطقية (& | && || ! xor)، واختبار الانتماء %in%. وأمران يجعلانها مختلفة عن معظم اللغات: أنها كلها تقريبًا متجهية - إذ تعمل على متجهات كاملة دفعة واحدة، عنصرًا عنصرًا - وأن R تملك معاملَي "و" اثنين ومعاملَي "أو" اثنين غير قابلين للتبادل. وتغطي هذه الصفحة جميعها، إضافة إلى مزالق الأسبقية التي تنتج أجوبة خاطئة بصمت.

الحسابية: ‏+ و- و* و/ و^ و%% و%/%

الخمسة الأولى تفعل ما تتوقعه. أما المعاملان المغلفان بعلامة النسبة - %% (الباقي) و%/% (القسمة الصحيحة، الخارج) - فهما ما يبحث عنه الناس:

لاحظ أن المعامل / يجري دائمًا قسمة بفاصلة عائمة - فالتعبير 17 / 5 يساوي 3.4 لا 3 أبدًا. وإذا أردت الجزء الصحيح، فذلك تمامًا ما وُجد %/% من أجله.

والمهمة اليومية للمعامل %% هي قابلية القسمة. فالعدد زوجي حين لا تترك قسمته على 2 باقيًا:

ويستحق السطر الثاني وقفة: فمع معامل سالب، يعيد %% في R نتيجة تحمل إشارة المقسوم عليه (فـ -7 %% 3 تساوي 2، لأن -7 = -3 * 3 + 2). وبعض اللغات تفعل العكس؛ فإن كنت تنقل شيفرة، فتحقق من ذلك.

معاملات المقارنة متجهية

تقارن المعاملات == و!= و< و<= و> و>= عنصرًا عنصرًا وتعيد متجهًا منطقيًا، لا جوابًا واحدًا:

وهذا هو المحرك خلف كل عمليات الترشيح في R تقريبًا - إذ تقارن متجهًا كاملًا بقيمة، فتحصل على قناع منطقي، ثم تستخدم القناع لاستخراج مجموعة جزئية. وثمة تحذير عند استخدام == مع الأعداد العشرية: فأعداد الفاصلة العائمة تُخزَّن تقريبيًا، لذا فإن 0.1 + 0.2 == 0.3 تعطي FALSE. وللمقارنات العشرية، فضّل all.equal() أو تحقق من abs(x - y) < 1e-9.

المعاملات المنطقية: & مقابل && (الالتباس الكلاسيكي)

تملك R معاملَي "و" ومعاملَي "أو"، واختيار الخاطئ منهما طقس عبور.

المعاملان & و| متجهيان. فهما يدمجان متجهين منطقيين عنصرًا عنصرًا:

استخدمهما كلما بنيت مرشِّحًا على البيانات: ‏df[df$age > 30 & df$city == "Lisbon", ].

والمعاملان && و|| قياسيان ويقصّران الدارة. فهما يأخذان قيمًا مفردة، ويعيدان قيمة TRUE/FALSE واحدة، ويتخطيان المعامل الثاني كليًا إذا حسم الأول الجواب أصلًا:

يبرهن السطر الثاني على تقصير الدارة: فلأن x < 0 تساوي FALSE، لا تقيّم R استدعاء stop() أبدًا. ولهذا تحديدًا ينتمي && إلى شروط if() - إذ يمكنك كتابة if (!is.na(x) && x > 10) فيُتخطى الجزء x > 10 بأمان حين تكون x مساوية لـ NA.

والقاعدة العملية: &/| للمتجهات وترشيح البيانات، و&&/|| لشروط if(). ومنذ الإصدار R 4.3، صار هذا مفروضًا بأنياب: فتمرير متجه بطول أكبر من واحد إلى && أو || خطأ (أما إصدارات R الأقدم فكانت تستخدم العنصر الأول بصمت، وهو ما أخفى عللًا حقيقية لسنوات).

وتكمل الدالة xor(a, b) المجموعة - فتعطي TRUE حين تكون إحدى القيمتين فقط TRUE:

المعامل %in%: اختبار الانتماء

يسأل x %in% table، لكل عنصر في x: "هل يظهر هذا في أي موضع من table؟" وهو من أكثر المعاملات استخدامًا في شيفرة R الواقعية:

ويمكن أن يكون الطرف المختبر متجهًا كاملًا، وهو ما يجعل %in% الأداة الطبيعية لترشيح الصفوف وفق مجموعة من القيم المسموح بها.

كما أنه يتفوق على البديل الذي كنت ستكتبه لولاه - سلسلة من مقارنات == ملصقة بالمعامل |:

فمع خمس قيم مسموح بها، تتحول سلسلة == إلى جدار من التكرار؛ بينما تكتفي نسخة %in% بتوسيع المتجه. وثمة ميزة ثانية أدق - فالمعامل %in% لا يعيد NA أبدًا:

فالتعبير NA == 1 يساوي NA لأن R لا تستطيع معرفة ما إذا كانت قيمة مجهولة تساوي 1 - وهو سلوك مشروح بعمق في القيم المفقودة. وتلك القيمة NA تسمّم بعد ذلك أي شرط if() تصل إليه. أما %in% فيتفادى المشكلة برمتها بإعطاء جواب TRUE أو FALSE دائمًا، ولهذا فهو الخيار الأكثر أمانًا للشروط على بيانات قد تحتوي قيمًا مفقودة.

مزالق الأسبقية

يفسر فخّان في أسبقية المعاملات نصيبًا غير متناسب من لحظات "R معطوبة". أولًا، المعامل ^ يرتبط بقوة أكبر من إشارة السالب الأحادية:

وثانيًا، النقطتان الرأسيتان ترتبطان بقوة أكبر من العمليات الحسابية الثنائية:

وعند الشك، أضف أقواسًا. فهي لا تكلف شيئًا، وكل قارئ (بمن فيهم أنت في المستقبل) يحللها كما يحللها المفسّر تمامًا.

المعاملان $ و[ ]: معاملا الوصول

سترى باستمرار أيضًا المعاملات $ و[ ] و[[ ]] - وهي تقنيًا معاملات كذلك، تُستخدم لسحب القيم من البنى لا للحساب بها:

وتحظى بتغطية كاملة في صفحات المتجهات والقوائم وإطارات البيانات - ويكفي هنا أن تتعرف عليها بوصفها أفرادًا في عائلة المعاملات نفسها.

ما تخرج به

  • يعطي %% الباقي، ويعطي %/% الخارج الصحيح؛ ويختبر x %% 2 == 0 الزوجية.
  • المقارنات متجهية - إذ تعيد متجهًا منطقيًا يمكنك الترشيح به.
  • يدمج &/| المتجهات عنصرًا عنصرًا؛ بينما &&/|| للقيم المفردة في if() ويقصّران الدارة. ومنذ الإصدار R 4.3، صار استخدام && مع متجه أطول خطأ.
  • يحل x %in% table محل سلاسل == ولا يعيد NA أبدًا.
  • التعبير -2^2 يساوي -4، والتعبير 1:n - 1 يبدأ من 0 - فاستخدم الأقواس عند الشك.

التالي: تشغيل هذه المعاملات داخل if وelse وifelse() - أي التعليمات الشرطية في R.

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

ماذا يفعل المعامل %% في R؟

المعامل %% هو معامل باقي القسمة - فهو يعيد باقي عملية قسمة. فالتعبير 17 %% 5 يساوي 2. ورفيقه %/% يجري القسمة الصحيحة ويعيد الخارج دون الباقي: فالتعبير 17 %/% 5 يساوي 3. والاستخدام الكلاسيكي للمعامل %% هو اختبار الأعداد الزوجية: ‏x %% 2 == 0.

ما الفرق بين & و&& في R؟

المعامل & متجهي: فهو يقارن متجهين عنصرًا عنصرًا ويعيد متجهًا بالطول نفسه. أما && فيعمل على القيم المفردة فقط، ويقصّر الدارة (فيتخطى المعامل الثاني إذا حسم الأول النتيجة أصلًا)، ويعيد قيمة TRUE أو FALSE واحدة بالضبط. استخدم & عند ترشيح المتجهات، و&& داخل شروط if(). ومنذ الإصدار R 4.3، صار تمرير متجه أطول من عنصر واحد إلى && أو || خطأ لا تحذيرًا.

ماذا يفعل المعامل %in% في R؟

يختبر x %in% table ما إذا كان كل عنصر من x يظهر في أي موضع من table، ويعيد TRUE أو FALSE لكل عنصر. ويحل التعبير "mango" %in% basket محل سلسلة من مقارنات == موصولة بالمعامل |، وبخلاف == فهو لا يعيد NA أبدًا - إذ تعطي القيمة المفقودة في الطرف المختبر النتيجة FALSE ببساطة.

لماذا يعطي -2^2 القيمة -4 في R؟

لأن المعامل ^ يرتبط بقوة أكبر من إشارة السالب الأحادية، فتقرأ R التعبير -2^2 بوصفه -(2^2) أي -4. وإذا كنت تقصد مربع العدد سالب اثنين، فاكتب (-2)^2 الذي يساوي 4. وللنقطتين الرأسيتين فخ مشابه: فالتعبير 1:n - 1 يعني (1:n) - 1 لا 1:(n - 1).

Coddy programming languages illustration

تعلّم البرمجة مع Coddy

ابدأ الآن