علم الآثار الترفيهي: دليل الأسلوب R تحت العدسة المكبرة

كما تعلمون ، يتم قراءة الكود في كثير من الأحيان أكثر مما هو مكتوب. حتى يتمكن شخص آخر بخلاف المؤلف من قراءتها ، وهناك أدلة على الأسلوب. بالنسبة إلى R ، قد يكون هذا ، على سبيل المثال ، دليل هادلي.

ليس دليل التصميم مجرد اتفاق ضمني بين المطورين - فالكثير من القواعد لها خلفية غريبة. لماذا يكون السهم <- أفضل من علامة المساواة = ، ولماذا لا يعجب الموقتون القدامى R الشرطة السفلية ، وكيف يرتبط طول الخط الموصى به ببطاقة لكمة ، وأكثر من ذلك بكثير - أكثر.

إخلاء المسئولية: دليل R Style
على عكس بيثون ، لا يوجد لدى R معيار واحد. وفقا لذلك ، لا يوجد دليل واحد. بالإضافة إلى دليل Hadley (أو نسخته الموسعة من tidyverse ) ، هناك آخرون ، مثل Google أو الموصل الحيوي .

ومع ذلك ، يمكن اعتبار دليل هادلي الأكثر شيوعًا (مثل فحص RStudio المضمن ، على سبيل المثال) ، والذي يُسهل إلى حد كبير بفضل شعبية المكتبات التي أنشأها هادلي نفسه (dplyr ، ggplot ، tidyr ، وغيرها من مجموعة tidyverse).

1. عامل التشغيل: <- مقابل =


توصي جميع الأدلة المتاحة باستخدام العامل غير القياسي <- ، ولكن ليس علامة المساواة = ، وهو أمر شائع للغات الحديثة الأخرى. ثلاثة عوامل أخرى ( <<- ، -> ، ->> ) لم يتم ذكرها (مثل التي كانت موجودة في الإصدارات السابقة := ). يبدو ، لماذا نحتاج إلى هذا السهم غير القياسي؟

يكشف التاريخ لنا البطاقات: في R ، جاء السهم من S ، والذي بدوره ورثه من APL. في APL ، سمح لنا بتمييز المهمة عن المساواة. في R ، عامل المساواة هو المعيار ، لذلك الفرق مختلف. إذا كان السهم عامل تشغيل مهمًا في البداية ، فحينئذٍ يتم تعيين قيم المساواة على المعلمات المسماة فقط . في عام 2001 ، أصبحت علامة المساواة هي مشغل المهمة ، لكنها لم تصبح مرادفًا للسهم.

ما الذي يتيح لنا التفكير = بديل كامل للسهم؟ بادئ ذي بدء ، = كيف يعمل مشغل المهمة في المستوى الأعلى فقط. على سبيل المثال ، داخل الوظيفة ، سيعمل كل شيء كما كان من قبل:

 mean(x = 1:5) # [1] 3 x # Error: object 'x' not found mean (x <- 1:5) # [1] 3 x # [1] 1 2 3 4 5 

هنا = تعيّن المعلمة الدالة فقط ، بينما تعيّن <- أيضًا القيمة للمتغير x. يمكننا تحقيق نفس التأثير من خلال وضع عملية الاحالة بين قوسين (لا ، هذا لا يزال ليس ليسب) :

 mean ((x = 1:5)) # [1] 3 x # [1] 1 2 3 4 5 

... أو في الأقواس:

 mean ({x = 1:5}) # [1] 3 x # [1] 1 2 3 4 5 

بالإضافة إلى ذلك ، يكون للسوق الأسبقية على علامة المساواة:

 x <- y <- 1 # OK x = y = 2 # OK x = y <- 3 # OK x <- y = 4 # Error in x <- y = 4 : could not find function "<-<-" 

فشل التعبير الأخير لأنه مكافئ لـ (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) # [1] TRUE x <- 0 ifelse(x < -1, T, F) # [1] FALSE 

في الحالة الأولى ، لا يوجد مسافة بين < و - ، مما ينشئ مشغل مهمة.

3. أسماء الوظائف والمتغيرات


تختلف أدلة الأنماط حول مسألة الأسماء: يوصي دليل هادلي بتسطير أسفل السطر لجميع الأسماء ؛ دليل Google - الفصل بين النقاط للمتغيرات ونمط الإبل مع الأحرف الصغيرة الأولى للوظائف ؛ يوصي الموصل الحيوي lowCamel لكل من الوظائف والمتغيرات. لا توجد وحدة في مجتمع البحث (R) بشأن هذه المسألة ، ويمكن العثور على جميع الأساليب الممكنة:

 lowerCamel period.separation lower_case_with_underscores allowercase UpperCamel 

لا يوجد نمط موحد حتى لأسماء R الأساسية (على سبيل المثال ، الأسماء المعروفة و row.names هي وظائف مختلفة!). إذا كنت لا تأخذ في الاعتبار allowercase غير قابل للقراءة (يمكن فقط لمستخدمي Matlab أن يحبوا ذلك) ، فهناك ثلاثة أنماط شائعة: LowerCamel ، وحرف صغير مع _ ، وحرف صغير مع فصل النقاط.



شعبية الأنماط المختلفة لأسماء الوظائف والمعلمات (اسم واحد يمكن أن يتوافق مع أنماط مختلفة). المصدر: أداء Rasmus Bååth على useR! 2017.

نفس الشيء في عام 2012

المصدر: البعث (2012). " حالة تسمية الاتفاقيات في R ". مجلة آر المجلد. 4/2 ، ص 74-75.

يُذكر الفصل من نقطة إلى نقطة إلى حد بعيد استخدام الطرق في البرمجة الموجهة للكائنات ، ولكنه شائع تاريخياً. من الشائع جدا أن هذا النمط بالذات يمكن اعتباره حقا R'vsky. على سبيل المثال ، تستخدمه معظم الوظائف الأساسية على وجه التحديد (وقد اجتمع الجميع للتو مع data.table و as.factor).

لكن الفصل _ هو أحد الأساليب الأقل شعبية (وهنا يتعارض هادلي مع الأغلبية). بالنسبة إلى العديد من مستخدمي R ، ستكون النقاط السفلية مزعجة: في ملحق Emacs Speaks Statistics الشهير ، يتم استبداله افتراضيًا بمشغل المهمة <- . والإعدادات الافتراضية ، بطبيعة الحال ، لا أحد تقريبا يتغير.

ومع ذلك ، فإن تأثير Emacs ESS لا يزال تفسيرًا من فئة "الذيل الذي يزعج الكلب". يوجد سبب قديم: في الإصدارات السابقة من R ، كانت الشرطة السفلية مرادفة للسهم <- . على سبيل المثال ، في عام 2000 ، يمكنك تلبية هذا:

 #      R c <- c(1,2,3,4,5) mean(c) [1] 3 c_mean <- mean(c) c [1] 3 

هنا ، بدلاً من إنشاء المتغير c_mean عيّن R القيمة 3 أولاً لمتغير المتغير ، ثم للمتغير c. في البحث الحديث ، لن تحدث مثل هذه التحولات ، بالطبع.

بسبب عدم الشعبية ، لا توجد وظائف هذا النمط من بين الوظائف الأساسية:

 #  3.5.1  25  grep("^[^\\.]*$", apropos("_"), value = T) 

أخيرًا ، يكون أسلوب lowCamel قابلاً للقراءة بشكل ضعيف عند استخدام الأسماء الطويلة:

 # ! GrossNationalIncomePerCapitaAtlasMethodCurrentUnitedStatesDollars 

وبالتالي ، من حيث الأسماء ، لا يمكن اعتبار توصيات الدليل لا لبس فيها ؛ بعد كل شيء ، هذه مسألة ذوق (طالما هناك اتساق في هذا).

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 ، فإن المطورين الذين يستخدمون المساحات يكسبون أكثر من أولئك الذين يستخدمون علامات التبويب. حجة أقوى من قواعد دليل الأسلوب ، أليس كذلك؟

بدلاً من الاستنتاج: قد تبدو قواعد أدلة الأسلوب غريبة وغير منطقية. في الواقع ، لماذا السهم <- إذا كان هناك مشغل قياسي = ؟ لكن إذا حفرت أعمق ، فبعد كل قاعدة يوجد بعض المنطق ، وغالبًا ما ينسى بالفعل.

Source: https://habr.com/ru/post/ar454432/


All Articles