كما تعلمون ، يتم قراءة الكود في كثير من الأحيان أكثر مما هو مكتوب. حتى يتمكن شخص آخر بخلاف المؤلف من قراءتها ، وهناك أدلة على الأسلوب. بالنسبة إلى R ، قد يكون هذا ، على سبيل المثال ، دليل هادلي.
ليس دليل التصميم مجرد اتفاق ضمني بين المطورين - فالكثير من القواعد لها خلفية غريبة. لماذا يكون السهم
<-
أفضل من علامة المساواة
=
، ولماذا لا يعجب الموقتون القدامى R الشرطة السفلية ، وكيف يرتبط طول الخط الموصى به ببطاقة لكمة ، وأكثر من ذلك بكثير - أكثر.
إخلاء المسئولية: دليل R Styleعلى عكس بيثون ، لا يوجد لدى R معيار واحد. وفقا لذلك ، لا يوجد دليل واحد. بالإضافة إلى
دليل Hadley (أو نسخته الموسعة من
tidyverse ) ، هناك آخرون ، مثل
Google أو
الموصل الحيوي .
ومع ذلك ، يمكن اعتبار دليل هادلي الأكثر شيوعًا (مثل
فحص RStudio المضمن ، على سبيل المثال) ، والذي يُسهل إلى حد كبير بفضل شعبية المكتبات التي أنشأها هادلي نفسه (dplyr ، ggplot ، tidyr ، وغيرها من مجموعة tidyverse).
1. عامل التشغيل: <-
مقابل =
توصي جميع الأدلة المتاحة باستخدام العامل غير القياسي
<-
، ولكن ليس علامة المساواة
=
، وهو أمر شائع للغات الحديثة الأخرى. ثلاثة عوامل أخرى (
<<-
،
->
،
->>
) لم يتم ذكرها (مثل التي كانت موجودة في الإصدارات السابقة
:=
). يبدو ، لماذا نحتاج إلى هذا السهم غير القياسي؟
يكشف التاريخ لنا البطاقات: في R ، جاء السهم من S ، والذي بدوره ورثه من APL. في APL ، سمح لنا بتمييز المهمة عن المساواة. في R ، عامل المساواة هو المعيار ، لذلك الفرق مختلف. إذا كان السهم عامل تشغيل مهمًا في البداية ، فحينئذٍ يتم تعيين قيم المساواة
على المعلمات المسماة
فقط . في عام 2001 ، أصبحت علامة المساواة هي مشغل المهمة ، لكنها لم تصبح مرادفًا للسهم.
ما الذي يتيح لنا التفكير
=
بديل كامل للسهم؟ بادئ ذي بدء ،
=
كيف يعمل مشغل المهمة في المستوى الأعلى فقط. على سبيل المثال ، داخل الوظيفة ، سيعمل كل شيء كما كان من قبل:
mean(x = 1:5)
هنا
=
تعيّن المعلمة الدالة فقط ، بينما تعيّن
<-
أيضًا القيمة للمتغير x. يمكننا تحقيق نفس التأثير من خلال وضع عملية الاحالة بين قوسين
(لا ، هذا لا يزال ليس ليسب) :
mean ((x = 1:5))
... أو في الأقواس:
mean ({x = 1:5})
بالإضافة إلى ذلك ، يكون للسوق الأسبقية على علامة المساواة:
x <- y <- 1
فشل التعبير الأخير لأنه مكافئ لـ
(x <- y) = 4
، والمحلل يفسره على أنه
`<-<-`(x, y = 4, value = 4)
بمعنى آخر ، نحاول إجراء عملية غير صحيحة: أولاً ، حدد x إلى y ثم حاول تعيين x و y إلى 4. سيتم معالجة التعبير دون أخطاء فقط إذا قمت بتغيير أولوية العمليات ذات الأقواس:
x <- (y = 4)
.
2. التباعد
يوصي الدليل بوضع مسافات بين المشغلين (فيما عدا ، الأقواس المربعة ،: ، :: و :: :) ، وكذلك قبل قوس الفتح. من الواضح أن هذا جزء من معايير ترميز جنو. ومع ذلك ، يرتبط هذا البند ارتباطًا وثيقًا باستخدام
<-
كمشغل تعيين. على سبيل المثال
x <-1
ما هذا X أقل من -1؟ أو تعيين س إلى 1؟
ومع ذلك ، فإن المساحة الإضافية ليست أفضل من المساحة المفقودة ، على سبيل المثال:
x <- 0 ifelse(x <-1, T, F)
في الحالة الأولى ، لا يوجد مسافة بين
<
و
-
، مما ينشئ مشغل مهمة.
3. أسماء الوظائف والمتغيرات
تختلف أدلة الأنماط حول مسألة الأسماء: يوصي دليل هادلي بتسطير أسفل السطر لجميع الأسماء ؛ دليل Google - الفصل بين النقاط للمتغيرات ونمط الإبل مع الأحرف الصغيرة الأولى للوظائف ؛ يوصي الموصل الحيوي lowCamel لكل من الوظائف والمتغيرات. لا توجد وحدة في مجتمع البحث (R) بشأن هذه المسألة ، ويمكن العثور على جميع الأساليب الممكنة:
lowerCamel period.separation lower_case_with_underscores allowercase UpperCamel
لا يوجد نمط موحد حتى لأسماء R الأساسية (على سبيل المثال ، الأسماء المعروفة و row.names هي وظائف مختلفة!). إذا كنت لا تأخذ في الاعتبار allowercase غير قابل للقراءة (يمكن فقط لمستخدمي Matlab أن يحبوا ذلك) ، فهناك ثلاثة أنماط شائعة: LowerCamel ، وحرف صغير مع _ ، وحرف صغير مع فصل النقاط.

شعبية الأنماط المختلفة لأسماء الوظائف والمعلمات (اسم واحد يمكن أن يتوافق مع أنماط مختلفة). المصدر:
أداء Rasmus Bååth على useR! 2017.
يُذكر الفصل من نقطة إلى نقطة إلى حد بعيد استخدام الطرق في البرمجة الموجهة للكائنات ، ولكنه شائع تاريخياً. من الشائع جدا أن هذا النمط بالذات يمكن اعتباره حقا R'vsky. على سبيل المثال ، تستخدمه معظم الوظائف الأساسية على وجه التحديد (وقد اجتمع الجميع للتو مع data.table و as.factor).
لكن الفصل _ هو أحد الأساليب الأقل شعبية (وهنا يتعارض هادلي مع الأغلبية). بالنسبة إلى العديد من مستخدمي R ، ستكون النقاط السفلية مزعجة: في ملحق Emacs Speaks Statistics الشهير ، يتم استبداله افتراضيًا بمشغل المهمة
<-
. والإعدادات الافتراضية ، بطبيعة الحال ، لا أحد
تقريبا يتغير.
ومع ذلك ، فإن تأثير Emacs ESS لا يزال تفسيرًا من فئة "الذيل الذي يزعج الكلب". يوجد سبب قديم: في الإصدارات السابقة من R ، كانت الشرطة السفلية مرادفة للسهم
<-
. على سبيل المثال ، في عام 2000 ، يمكنك
تلبية هذا:
هنا ، بدلاً من إنشاء المتغير
c_mean
عيّن R القيمة 3 أولاً لمتغير المتغير ، ثم للمتغير c. في البحث الحديث ، لن تحدث مثل هذه التحولات ، بالطبع.
بسبب عدم الشعبية ، لا توجد وظائف هذا النمط من بين الوظائف الأساسية:
أخيرًا ، يكون أسلوب lowCamel قابلاً للقراءة بشكل ضعيف عند استخدام الأسماء الطويلة:
وبالتالي ، من حيث الأسماء ، لا يمكن اعتبار توصيات الدليل لا لبس فيها ؛ بعد كل شيء ، هذه مسألة ذوق (طالما هناك اتساق في هذا).
4. الأقواس المتعرجة
وفقًا للدليل ، يجب أن يتبع الخط الجديد دعامة مجعد الفتح ، ويجب أن يكون السطر المغلق على سطر منفصل (ما لم يتبعه غير ذلك). أي شيء مثل هذا:
if (x >= 0) { log(x) } else { message("Not applicable!") }
كل شيء هنا ليس ممتعًا للغاية: هذا هو أسلوب المسافة البادئة القياسي لـ K&R ، الذي يعود إلى اللغة C والكتاب الشهير لكيرنيغان وريتشي "The C Programming Language" (أو K&R بأسماء المؤلفين).
إن أصول هذا النمط واضحة تمامًا أيضًا: فهي تتيح لك حفظ الخطوط ، مع الحفاظ على قابلية القراءة. بالنسبة لأجهزة الكمبيوتر المبكرة ، كانت المساحة الرأسية أكثر من مجرد رفاهية. على سبيل المثال ، تم تطوير C على PDP-11 ، في الطرف الذي كان هناك فقط 24 سطرًا. وعند طباعة كتاب K&R ، حفظ هذا النمط الورق!
5. 80 حرف السلسلة
طول الخط الموصى به وفقًا للدليل هو 80 حرفًا. تم العثور على الرقم السحري 80 ليس فقط في R ، ولكن أيضًا في عدد كبير من اللغات الأخرى (Java و Perl و PHP وغيرها). وليس فقط اللغات: حتى سطر أوامر Windows يتكون من 80 حرفًا.
لأول مرة في البرمجة ، ظهر هذا الرقم في عام 1928 بدلاً من بطاقة IBM المثقوبة القياسية ، حيث كان هناك 80 عمودًا بالضبط للبيانات. والسؤال الأكثر إثارة للاهتمام هو لماذا تم اختيار هذا المعيار؟ بعد كل شيء ، تم استخدام بطاقات مثقوبة بطول مختلف (لمدة 24 أو 45 عمودًا).

الجواب الأكثر شعبية يرتبط طول بطاقة لكمة لطول الخط من الآلات الكاتبة. تم تصميم الآلات الأولى للورقة القياسية الأمريكية مقاس 8 × 11 بوصة ، وسمح لها بالطباعة من 72 إلى 90 حرفًا ، اعتمادًا على حجم الهوامش. لذلك ، يبدو إصدار 80 حرفًا في كل سطر معقولًا ، على الرغم من أنه غير صحيح في الملاذ الأخير. من الممكن أن يكون 80 حرفًا هي الأرضية الوسطى من حيث بيئة العمل.
6. المسافة البادئة للخط: المسافات مقابل علامات التبويب
النمط الموصى به من قبل الدليل هو مسافتين ، وليس علامة تبويب. إن رفض الجدولة مفهوم تمامًا: يختلف طول TAB في برامج تحرير النصوص المختلفة (يمكن أن يكون أي شيء من 2 إلى 8 مسافات). عند رفضهم ، نحصل على ميزتين في آن واحد: أولاً ، سيبدو الرمز كما هو بالضبط كما كتبناه ؛ ثانياً ، لن يكون هناك انتهاك عرضي لطول السلسلة الموصى به. في هذه الحالة ، بالطبع ، نقوم بزيادة حجم الملف (من يريد التعامل مع مثل هذه التنبيهات الدقيقة في 2k19؟)
إن مساحات النزاع مقابل علامات التبويب لها تاريخ طويل ، ويمكن مساواتها بالعلامات الدينية (مثل Win vs Linux ، و Android مقابل iOS ، وما شابه). ومع ذلك ، فنحن نعرف بالفعل من فاز بها: وفقًا لدراسة Stack Overflow ، فإن المطورين الذين يستخدمون المساحات يكسبون أكثر من أولئك الذين يستخدمون علامات التبويب. حجة أقوى من قواعد دليل الأسلوب ، أليس كذلك؟
بدلاً من الاستنتاج: قد تبدو قواعد أدلة الأسلوب غريبة وغير منطقية. في الواقع ، لماذا السهم
<-
إذا كان هناك مشغل قياسي
=
؟ لكن إذا حفرت أعمق ، فبعد كل قاعدة يوجد بعض المنطق ، وغالبًا ما ينسى بالفعل.