كيفية إنشاء متغير في R
المتغير في R اسم مرتبط بقيمة. وتنشئه بسهم الإسناد <-: الاسم قبل السهم، والقيمة بعده.
ثلاثة متغيرات، وثلاثة أنواع مختلفة من القيم، ولا تصريحات أنواع في أي موضع - إذ تستنتج R النوع من القيمة نفسها (المزيد عن ذلك في أنواع البيانات). وبمجرد وجود المتغير، تستخدمه في أي مكان تستخدم فيه القيمة:
وإعادة الإسناد تعمل بالطريقة نفسها. فالمتغير ينتقل بسرور إلى قيمة جديدة - بل إلى نوع جديد - لحظة إسنادك ثانية:
لم تعترض R على تحول سلسلة نصية إلى رقم. وهذه المرونة مريحة، لكن إذا تبدّل معنى متغير في منتصف نص برمجي، فتلك عادة إشارة لك لاختيار اسم جديد بدلًا من ذلك.
لماذا تستخدم R الرمز <- بدلًا من =
إليك السؤال الذي يطرحه الجميع: التعبير age = 30 يعمل أيضًا، فلماذا يستخدم كل كتاب ودليل تنسيق وحزمة في R ذلك السهم؟
لأن الرمز = في R شيئان مختلفان بحسب موضع ظهوره. ففي المستوى الأعلى يسند. وداخل استدعاء دالة يطابق وسيطًا بالاسم - ولا ينشئ متغيرًا:
ولو جربت mean(values, na.rm <- TRUE) لأنشأت بالخطأ متغيرًا عامًا اسمه na.rm ومررت TRUE بالموضع - قانوني، وخاطئ، ويصعب اكتشافه. والعرف الذي يبقي هذا مقروءًا بسيط:
-
<-تعني الإسناد دائمًا. -
=تعني دائمًا "هذا الوسيط يأخذ هذه القيمة" داخل استدعاء دالة.
اتبع هذا الفصل وسيخبرك كل سطر من R تقرؤه بلمحة إن كان شيء يُنشأ أم يُمرَّر. وهي أكثر قواعد التنسيق عمومية في عالم R - حتى إن RStudio يمنح <- اختصار لوحة مفاتيح خاصًا به (Alt+-).
الأقارب نادرو الاستخدام: -> و= وassign()
تملك R طريقتين إضافيتين للإسناد، وكلتاهما تستحق التعرف عليها حتى إن كنت نادرًا ما تكتبهما.
يسند السهم المعكوس -> في الاتجاه المعاكس - القيمة أولًا، والاسم آخرًا:
ستراه أحيانًا في ختام خط معالجة طويل ("احسب كل هذا ثم خزّنه")، لكن معظم أدلة التنسيق تنصح بتجنبه: فالقراء يمسحون مستهل السطر بحثًا عن الاسم الذي يُعرَّف.
أما assign() فتنشئ متغيرًا انطلاقًا من سلسلة نصية، ما يعني أن الاسم يمكن أن يُبنى أثناء التنفيذ:
يبدو هذا ذكيًا وهو الأداة الخاطئة في الأحوال كلها تقريبًا - فمجموعة من المتغيرات المرقّمة هي في الحقيقة متجه أو قائمة في هيئة متنكرة. لا تلجأ إلى assign() إلا حين يجب فعلًا حساب الاسم؛ ورفيقتها get("score") تقرأ متغيرًا باسمه النصي.
قواعد التسمية
تقبل R الأسماء التي:
- تحتوي حروفًا وأرقامًا ونقاطًا (
.) وشرطات سفلية (_). - تبدأ بحرف، أو بنقطة لا يتبعها رقم.
- ليست كلمات محجوزة (
ifوforوTRUEوNULLوfunction، وقليل غيرها).
لذا فهذه كلها صالحة:
وهذه ليست كذلك:
2nd_user- لا يمكن أن يبدأ الاسم برقم._temp- ولا يمكن أن يبدأ بشرطة سفلية أيضًا (بخلاف Python).user-name- فالشرطة عملية طرح لا محرف اسم.TRUE- كلمة محجوزة.
والأسماء حساسة لحالة الأحرف: فـ total وTotal وTOTAL ثلاثة متغيرات لا صلة بينها، ولن تحذرك R حين تنشئ أحدها بخطأ مطبعي.
السرد والحذف: ls() وrm()
كل متغير تنشئه يستقر في مساحة العمل (البيئة العامة). وتسرد ls() ما فيها، وتحذف rm() الأشياء منها:
هناك تفصيلان يستحقان المعرفة. أولًا، rm(list = ls()) تمسح مساحة العمل بأكملها - وهي مفيدة في مستهل جلسة استكشافية، ومدمرة في أي مكان آخر. وثانيًا، الأسماء التي تبدأ بنقطة (مثل .cache) مخفية عن ls() ما لم تستدعِ ls(all.names = TRUE) - وهو العرف نفسه المتبع مع الملفات المخفية في Unix.
أعراف التسمية: استخدم snake_case
فيما يتجاوز القواعد الصارمة، استقر مجتمع R الحديث (ودليل تنسيق tidyverse) على أعراف:
-
lower_snake_caseللمتغيرات والدوال: retry_countوfit_model. - النقاط في الأسماء قانونية لكنها قديمة الطراز: فـ R الأساسية مليئة بأسماء من حقبة
data.frameمثلmy.data، لكن النقاط تحمل معنى أيضًا في نظام أساليب S3 في R (فـprint.data.frameتعني "أسلوب الطباعة الخاص بإطارات البيانات")، لذا تتجنبها الشيفرة الجديدة. - لا بادئات هنغارية، ولا نمط camelCase - ستصادف
camelCaseفي الحزم الأقدم، لكنsnake_caseهو ما استقرت عليه المنظومة. - لا تملك R ثوابت حقيقية؛ والعرف هو تسمية ما يُفترض أنه ثابت بحروف كبيرة (
MAX_RETRIES <- 5) وببساطة عدم إعادة إسناده.
اختر أسماء وصفية والتزم بالاتساق. فالاسم avg_score يكلفك أربع ضغطات مفاتيح إضافية مقارنة بـ as ويوفر على كل قارئ لاحق رحلة بحث في مستهل النص البرمجي.
ما تخرج به
- الصيغة
name <- valueتنشئ متغيرًا؛ ويحفظ المجتمع الرمز=لوسائط الدوال. - الرمزان
->وassign()موجودان؛ وستقرؤهما أكثر مما ينبغي أن تكتبهما. - تستخدم الأسماء حروفًا وأرقامًا ونقاطًا وشرطات سفلية؛ ولا يمكن أن تبدأ برقم أو شرطة سفلية، وهي حساسة لحالة الأحرف.
- تعرض
ls()مساحة العمل، وتنظّفهاrm(). - اكتب بنمط
snake_caseوستبدو شيفرتك مثل شيفرة R التي يكتبها الجميع اليوم.
التالي: ما أنواع القيم التي تحملها تلك المتغيرات فعلًا - العددية والصحيحة والنصية والمنطقية.
الأسئلة الشائعة
كيف تنشئ متغيرًا في R؟
اكتب الاسم، ثم سهم الإسناد <-، ثم القيمة: age <- 30. وتستنتج R النوع من القيمة - فلا توجد خطوة تصريح. والتعبير age = 30 يعمل أيضًا في المستوى الأعلى، لكن عرف المجتمع هو <-.
ما الفرق بين <- و= في R؟
في المستوى الأعلى من النص البرمجي يؤديان الوظيفة نفسها. أما داخل استدعاء دالة فلا: فالتعبير mean(x, na.rm = TRUE) يستخدم = لمطابقة وسيط بالاسم، لا لإنشاء متغير. ولأن = يؤدي الدورين حسب السياق، تحفظ أدلة تنسيق R الرمز <- للإسناد و= للوسائط.
كيف تحذف متغيرًا في R؟
تزيل rm(x) المتغير x من مساحة العمل. وتزيل rm(list = ls()) كل شيء - وهي مفيدة للبدء من صفحة نظيفة، وخطرة في منتصف التحليل. وتسرد ls() ما هو موجود حاليًا.
هل يمكن أن تحتوي أسماء متغيرات R على نقاط؟
نعم - فالاسم my.data قانوني تمامًا، وشيفرة R القديمة تستخدم النقاط في كل مكان. لكن الأسلوب الحديث يفضّل الشرطات السفلية (my_data) لأن النقاط تحمل معنى أيضًا في نظام أساليب S3 في R، وهو ما يجعل الأسماء المنقوطة ملتبسة عند القراءة.