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

بنية لغة R: الأساسيات في خمس دقائق

جوهر بنية R: الإسناد بالرمز <-، والتعبيرات والطباعة التلقائية، واستدعاءات الدوال بوسائط مسماة، وقاعدة أن كل شيء متجه.

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

التعبيرات والطباعة التلقائية

R لغة تعبيرية: فكل سطر تكتبه تقريبًا ينتج قيمة. وفي الطرفية، يُقيَّم أي تعبير تكتبه بمفرده وتُطبع قيمته تلقائيًا - دون حاجة إلى print():

تُسبَق كل نتيجة بالعلامة [1] - وهي طريقة R لإخبارك بموضع أول قيمة معروضة، وأول تلميح إلى أن R تفكر بالمتجهات (وسنعود إلى ذلك قريبًا). وللطباعة التلقائية شرط يستحق معرفته منذ اليوم الأول: فهي تنطبق على التعبيرات المجردة في المستوى الأعلى. أما التعبير نفسه داخل جسم دالة أو حلقة for فلا يطبع شيئًا، ولهذا تستخدم النصوص البرمجية استدعاءات cat() أو print() الصريحة للمخرجات التي يجب أن تراها.

الإسناد: السهم

معامل الإسناد في R هو <-، وهو سهم يشير إلى الاسم الذي يستقبل القيمة:

اقرأ radius <- 5 بمعنى "radius يأخذ 5". نعم، يعمل الرمز = أيضًا للإسناد في المستوى الأعلى، ونعم، يسأل القادمون الجدد لماذا يكتب أحدهم محرفين بدل محرف واحد. والجواب هو عرف له أنياب: فكل دليل تنسيق رئيسي، ووثائق R الأساسية، وفعليًا كل شيفرة R ستقرؤها يومًا، تستخدم <- للإسناد، وتحفظ = لمهمة واحدة محددة - تسمية الوسائط داخل استدعاءات الدوال (كما في القسم التالي). واتباع العرف يجعل العمليتين متمايزتين بصريًا. وفي RStudio، يكتب لك الاختصار Alt+- ‏(Option+- على macOS) السهم تلقائيًا.

لاحظ أن الإسناد لا يُطبع تلقائيًا - فالتعبير area <- 78.5 يخزّن القيمة بصمت. ولهذا يحتاج المثال إلى استدعاء print().

حساسية حالة الأحرف

R حساسة تمامًا لحالة الأحرف، في الأسماء التي تنشئها والأسماء التي توفرها اللغة على السواء:

متغيران مختلفان. وبالمثل فإن mean() دالة، بينما Mean() غير موجودة. وحين تستقبلك R برسالة object 'x' not found أو could not find function، تحقق من حالة الأحرف قبل أي شيء آخر - فهو أشيع خطأ لدى المبتدئين على الإطلاق.

استدعاءات الدوال والوسائط المسماة

تُستدعى الدوال بأقواس، وتُفصل الوسائط بفواصل. ويمكن مطابقة الوسائط بالموضع، أو بالاسم، أو بمزيج منهما:

يعرض استدعاء seq() صياغة الوسائط المسماة في R - وهنا يثبت الرمز = جدارته: فداخل الاستدعاء، يعنون name = value وسيطًا ما. والوسائط المسماة تعفيك من تذكر ترتيب المعاملات، وتجعل الاستدعاءات موثقة ذاتيًا؛ فالتعبير seq(0, 100, 25) يعمل بالطريقة نفسها لكنه يخبر القارئ أقل. والعرف العملي: مرر الوسيط الأول (وهو البيانات عادة) بالموضع، وسمّ ما تبقى.

والحصول على مساعدة حول أي دالة يستغرق ضغطة واحدة: فكتابة ?seq في الطرفية تفتح وثائقها.

كل شيء متجه

الفكرة التي تجعل R مختلفة عن غيرها من اللغات: لا وجود لأرقام مفردة مجردة. فحتى القيمة 5 متجه بطول واحد، وتنطبق العمليات عنصرًا عنصرًا على متجهات كاملة:

لا حلقة تكرار في أي موضع، ومع ذلك جرى تحويل كل عنصر. في معظم اللغات يعني ذلك ثلاث دورات لحلقة for؛ أما في R فهو مجرد عملية حسابية. هذا هو التوجيه المتجهي، وهو يشكّل كل شيء - فمعاملات المقارنة، ودوال السلاسل النصية، والدوال الرياضية تعمل جميعها بهذه الطريقة. ولهذا تحوي شيفرة R الاصطلاحية حلقات أقل بكثير مما تتوقع؛ والقصة الكاملة في المتجهات.

الأقواس المعقوفة والكتل

تُجمَّع الأجسام متعددة الأسطر - في if والحلقات والدوال - داخل أقواس معقوفة {}:

هناك أمران جديران بالانتباه. الشرط يوضع بين قوسين، والكلمة هي if المجردة، لا if: ولا if ... then. وخلافًا لـ Python، لا تحمل المسافات البادئة أي معنى في R - فالأقواس المعقوفة تعرّف الكتلة، والمسافات البادئة للبشر. وتجاهل الأقواس في الجمل ذات السطر الواحد قانوني لكنه مصدر كلاسيكي لأخطاء التحرير؛ فاستخدمها دائمًا.

المسافات والفواصل المنقوطة

تتجاهل R المسافات الزائدة، وينهي السطر الجديد التعليمة - دون حاجة إلى فاصلة منقوطة:

ينجح التقسيم عبر الأسطر لأن السطر الثالث ينتهي بالرمز +، فتعرف R أن التعبير لم يكتمل. وهذه هي القاعدة الوحيدة التي يجب تذكرها عند تقسيم الأسطر الطويلة: قسّم بعد معامل أو فاصلة، لا قبله، وإلا عاملت R السطر الأول على أنه مكتمل. والفواصل المنقوطة موجودة فقط لحشر تعليمتين في سطر واحد (a <- 1; b <- 2) - قانونية، وغير مستحبة، ويسهل تجنبها.

التنسيق: كيف تُكتب شيفرة R

فيما يتجاوز القواعد النحوية، لدى R أعراف مجتمعية قوية (مدوّنة في دليل تنسيق tidyverse الذي تتبعه معظم المنظومة):

  • <- للإسناد، و= فقط للوسائط داخل الاستدعاءات.
  • أسماء بنمط snake_case: ‏monthly_revenue لا monthlyRevenue ولا monthly.revenue. والنقاط قانونية في أسماء R لكن يُفضل تجنبها - فهي تتصادم مع نمط تسمية تستخدمه أجزاء R الداخلية.
  • مسافات حول المعاملات (x <- a * 2 لا x<-a*2) وبعد الفواصل.
  • مسافة بادئة بأربع مسافات داخل الأقواس المعقوفة (تستخدم بعض الفرق مسافتين؛ اختر واحدة والتزم بها).
  • تعليمة واحدة في كل سطر.

لا شيء من هذا يفرضه المفسّر. لكن كل شيء منه يفرضه من يقرأ شيفرتك. ويتواصل الشق المتعلق بالتسمية في درس المتغيرات.

ما تخرج به

  • تقيّم R التعبيرات وتطبع المجرد منها تلقائيًا في الطرفية - لكن ليس داخل الدوال أو الحلقات.
  • أسند بالرمز <- ("يأخذ")؛ واستخدم = فقط لتسمية الوسائط في استدعاءات الدوال.
  • R حساسة تمامًا لحالة الأحرف - وأخطاء حالة الأحرف تسبب معظم رسائل "غير موجود" في البدايات.
  • كل شيء متجه، وتنطبق العمليات عنصرًا عنصرًا: فالتعبير c(1, 2, 3) * 2 يساوي 2 4 6، دون أي حلقة.
  • تعرّف الأقواس المعقوفة الكتل، وتنهي الأسطر الجديدة التعليمات، ويجعل نمط snake_case مع أعراف المسافات شيفرتك مقروءة مثل شيفرة الجميع.

التالي: التعليقات - كيف توثّق شيفرة R، وماذا تفعل حيال غياب صياغة التعليقات الكتلية في R.

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

ماذا يعني الرمز <- في R؟

الرمز <- هو معامل الإسناد في R: فالتعبير x <- 5 يخزّن القيمة 5 تحت الاسم x. اقرأه بمعنى 'يأخذ'. والرمز = يسند أيضًا في المستوى الأعلى، لكن عرف المجتمع - الذي يفرضه كل دليل تنسيق رئيسي - هو استخدام <- للإسناد و= فقط لتسمية الوسائط داخل استدعاءات الدوال.

هل R حساسة لحالة الأحرف؟

نعم، حساسية كاملة. فـ total وTotal وTOTAL ثلاثة أسماء مختلفة، واستدعاء Mean(x) بدل mean(x) خطأ لا تحذير. وغالبًا ما يكون خطأ 'could not find function' أو 'object not found' مجرد خطأ مطبعي في حالة الأحرف.

هل أحتاج إلى الفواصل المنقوطة في R؟

لا. فسطر جديد ينهي التعليمة. ولا تلزم الفواصل المنقوطة إلا لحشر تعليمتين في سطر واحد (a <- 1; b <- 2)، وهو ما تنصح أدلة التنسيق بتجنبه أصلًا. اكتب تعليمة واحدة في كل سطر ولن تفكر في الفواصل المنقوطة مجددًا.

ماذا يعني أن R لغة متجهية؟

عمليات R الأساسية تعمل على متجهات كاملة دفعة واحدة. فالتعبير c(1, 2, 3) * 2 يعطي 2 4 6 - إذ ينطبق الضرب على كل عنصر دون أي حلقة تكرار. ومعظم الشيفرة التي تحتاج إلى حلقة for في لغة أخرى تصبح تعبيرًا واحدًا في R.

Coddy programming languages illustration

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

ابدأ الآن