6 سير العمل: السكربتات والمشاريع
سيعرفك هذا الفصل على أداتين أساسيتين لتنظيم الكود الخاص بك: السكربتات (scripts) والمشاريع (projects).
6.1 السكربتات (Scripts)
حتى الآن، كنت تستخدم شاشة التفاعل (console) لتشغيل الكود. يعد ذلك مكاناً رائعاً للبدء، ولكنك ستجد أنه يضيق بك بسرعة كبيرة عندما تبدأ في إنشاء رسومات ggplot2 أكثر تعقيداً وسلاسل معالجة dplyr أطول. لمنح نفسك مساحة أكبر للعمل، استخدم محرر السكربتات (script editor). افتحه بالنقر فوق قائمة File، واختيار New File، ثم R script، أو باستخدام اختصار لوحة المفاتيح Cmd/Ctrl + Shift + N. الآن سترى أربعة أجزاء (panes)، كما هو موضح في الشكل 6.1. يعد محرر السكربتات مكاناً رائعاً لتجربة الكود الخاص بك. عندما تريد تغيير شيء ما، فلن تضطر إلى إعادة كتابة الكود بأكمله، بل يمكنك فقط تعديل السكربت وإعادة تشغيله. وبمجرد كتابة كود يعمل ويحقق ما تريد، يمكنك حفظه كملف سكربت للعودة إليه بسهولة لاحقاً.
6.1.1 تشغيل الكود (Running code)
يعد محرر السكربتات مكاناً ممتازاً لبناء رسومات ggplot2 المعقدة أو التتابعات الطويلة من عمليات المعالجة باستخدام dplyr. المفتاح لاستخدام محرر السكربتات بفعالية هو حفظ أحد أهم اختصارات لوحة المفاتيح: Cmd/Ctrl + Enter. يقوم هذا الاختصار بتنفيذ تعبير R الحالي في شاشة التفاعل (console). على سبيل المثال، خذ الكود أدناه.
library(dplyr)
library(nycflights13)
not_cancelled <- flights |>
filter(!is.na(dep_delay)█, !is.na(arr_delay))
not_cancelled |>
group_by(year, month, day) |>
summarize(mean = mean(dep_delay))إذا كان المؤشر عند █، فإن الضغط على Cmd/Ctrl + Enter سيقوم بتشغيل الأمر الكامل الذي ينشئ الكائن not_cancelled. كما سيقوم بنقل المؤشر إلى العبارة التالية (التي تبدأ بـ not_cancelled |>). هذا يجعل من السهل تتبع السكربت الكامل خطوة بخطوة عن طريق الضغط المتكرر على Cmd/Ctrl + Enter.
بدلاً من تشغيل الكود الخاص بك جزءاً بجزء، يمكنك أيضاً تنفيذ السكربت بالكامل في خطوة واحدة باستخدام Cmd/Ctrl + Shift + S. إن القيام بذلك بانتظام يعد طريقة رائعة للتأكد من أنك قمت بتضمين جميع الأجزاء المهمة من الكود الخاص بك في السكربت.
نوصيك دائماً ببدء السكربت الخاص بك بالحزم (packages) التي تحتاجها. بهذه الطريقة، إذا شاركت الكود الخاص بك مع الآخرين، فيمكنهم بسهولة معرفة الحزم التي يحتاجون إلى تثبيتها. ومع ذلك، لاحظ أنه لا ينبغي لك أبداً تضمين الأمر install.packages() في سكربت تشاركه مع الآخرين. فمن غير اللائق تقديم سكربت سيقوم بتغيير شيء ما على أجهزتهم إذا لم يكونوا حذرين!
عند العمل على الفصول القادمة، نوصي بشدة بالبدء في محرر السكربتات وممارسة اختصارات لوحة المفاتيح. مع مرور الوقت، سيصبح إرسال الكود إلى شاشة التفاعل بهذه الطريقة أمراً طبيعياً للغاية لدرجة أنك لن تفكر فيه حتى.
6.1.2 أدوات الفحص والتشخيص في RStudio
في محرر السكربتات، سيقوم RStudio بتمييز أخطاء بناء الجملة (syntax errors) بخط متعرج أحمر وعلامة خطأ (X) في الشريط الجانبي:

مرر مؤشر الفأرة فوق علامة الخطأ لمعرفة طبيعة المشكلة:

سيقوم RStudio أيضاً بتنبيهك بالمشكلات المحتملة:

6.1.3 الحفظ والتسمية
يقوم RStudio تلقائياً بحفظ محتويات محرر السكربتات عند الخروج، ويعيد تحميلها تلقائياً عند إعادة الفتح. ومع ذلك، من الجيد تجنب الأسماء الافتراضية مثل Untitled1 و Untitled2 و Untitled3 وما إلى ذلك، وبدلاً من ذلك قم بحفظ السكربتات الخاصة بك ومنحها أسماءً توضيحية.
قد يكون من المغري تسمية ملفاتك باسم code.R أو myscript.R، ولكن يجب عليك التفكير ملياً قبل اختيار اسم لملفك. هناك ثلاثة مبادئ مهمة لتسمية الملفات وهي كالتالي:
- يجب أن تكون أسماء الملفات قابلة للقراءة بواسطة الآلة (machine): تجنب المسافات، والرموز، والأحرف الخاصة. لا تعتمد على حساسية حالة الأحرف (case sensitivity) للتمييز بين الملفات.
- يجب أن تكون أسماء الملفات قابلة للقراءة بواسطة البشر (human): استخدم أسماء الملفات لوصف ما يحتويه الملف.
- يجب أن تتماشى أسماء الملفات بشكل جيد مع الترتيب الافتراضي: ابدأ أسماء الملفات بأرقام بحيث يضعها الفرز الأبجدي في الترتيب الذي يتم استخدامها به.
على سبيل المثال، افترض أن لديك الملفات التالية في مجلد المشروع:
alternative model.R
code for exploratory analysis.r
finalreport.qmd
FinalReport.qmd
fig 1.png
Figure_02.png
model_first_try.R
run-first.r
temp.txt
هناك مجموعة متنوعة من المشكلات هنا: من الصعب معرفة الملف الذي يجب تشغيله أولاً، وتحتوي أسماء الملفات على مسافات، وهناك ملفان يحملان الاسم نفسه ولكن باختلاف حالة الأحرف (finalreport مقابل FinalReport 1), وبعض الأسماء لا تصف محتوياتها (run-first و temp).
إليك طريقة أفضل لتسمية وتنظيم نفس المجموعة من الملفات:
01-load-data.R
02-exploratory-analysis.R
03-model-approach-1.R
04-model-approach-2.R
fig-01.png
fig-02.png
report-2022-03-20.qmd
report-2022-04-02.qmd
report-draft-notes.txt
إن ترقيم السكربتات الأساسية يجعل من الواضح الترتيب الذي يجب تشغيلها به، كما أن نظام التسمية المتسق يسهل رؤية ما يتغير. بالإضافة إلى ذلك، تم تسمية الأشكال بشكل متشابه، وتم تمييز التقارير بالتواريخ المدرجة في أسماء الملفات، وتم تغيير اسم الملف temp إلى report-draft-notes لوصف محتوياته بشكل أفضل. إذا كان لديك الكثير من الملفات في دليل واحد، فمن المستحسن اتخاذ خطوة إضافية في التنظيم ووضع أنواع مختلفة من الملفات (مثل السكربتات، الأشكال، إلخ) في مجلدات فرعية منفصلة.
6.2 المشاريع (Projects)
في يوم من الأيام، ستحتاج إلى إغلاق R والذهاب للقيام بشيء آخر، ثم العودة إلى تحليلك لاحقاً. وفي يوم من الأيام، ستعمل على تحليلات متعددة في نفس الوقت وتريد الاحتفاظ بها منفصلة عن بعضها البعض. وفي يوم من الأيام، ستحتاج إلى جلب بيانات من العالم الخارجي إلى R وإرسال النتائج الرقمية والأشكال من R إلى العالم الخارجي مجدداً.
للتعامل مع هذه المواقف الواقعية، تحتاج إلى اتخاذ قرارين:
- ما هو مصدر الحقيقة (source of truth)؟ ما الذي ستحفظه كسجل دائم لما حدث؟
- أين يستقر تحليلك؟
6.2.1 ما هو مصدر الحقيقة؟
كمبتدئ، لا بأس بالاعتماد على بيئة العمل الحالية (Environment) لاحتواء جميع الكائنات التي أنشأتها طوال تحليلك. ومع ذلك، لتسهيل العمل في مشاريع أكبر أو التعاون مع الآخرين، يجب أن يكون مصدر الحقيقة الخاص بك هو سكربتات R. باستخدام سكربتات R (وملفات البيانات الخاصة بك)، يمكنك إعادة إنشاء بيئة العمل بالكامل. بينما لو كان لديك بيئة العمل فقط، فسيكون من الأصعب بكثير إعادة إنشاء سكربتات R: سيتعين عليك إما إعادة كتابة الكثير من الكود من الذاكرة (ومعها ارتكاب الأخطاء حتماً) أو سيتعين عليك التنقيب بعناية في تاريخ أوامر R الإحصائية (R history).
للمساعدة في إبقاء سكربتات R كمصدر للحقيقة لتحليلك، نوصي بشدة بتوجيه RStudio بعدم الاحتفاظ بمساحة العمل (workspace) الخاصة بك بين الجلسات. يمكنك القيام بذلك إما عن طريق تشغيل usethis::use_blank_slate() 2 أو عن طريق محاكاة الخيارات الموضحة في الشكل 6.2. سيسبب لك هذا بعض الألم على المدى القصير، لأنه الآن عندما تعيد تشغيل RStudio، لن يتذكر الكود الذي قمت بتشغيله في المرة الأخيرة ولن تكون الكائنات التي أنشأتها أو مجموعات البيانات التي قرأتها متاحة للاستخدام. ولكن هذا الألم قصير المدى يجنبك عذاباً طويلاً على المدى الطويل لأنه يجبرك على تسجيل جميع الإجراءات المهمة في الكود الخاص بك. لا يوجد شيء أسوأ من اكتشاف بعد ثلاثة أشهر من الواقعة أنك قمت فقط بتخزين نتائج عملية حسابية مهمة في بيئة العمل الخاصة بك، وليس الحساب نفسه في الكود الخاص بك.
هناك ثنائية رائعة من اختصارات لوحة المفاتيح التي ستعمل معاً للتأكد من أنك قمت بتسجيل الأجزاء المهمة من الكود الخاص بك في المحرر:
- اضغط على Cmd/Ctrl + Shift + 0/F10 لإعادة تشغيل R.
- اضغط على Cmd/Ctrl + Shift + S لإعادة تشغيل السكربت الحالي.
نحن نستخدم هذا النمط بشكل جماعي مئات المرات في الأسبوع.
بدلاً من ذلك، إذا كنت لا تستخدم اختصارات لوحة المفاتيح، يمكنك الانتقال إلى Session > Restart R ثم تظليل السكربت الحالي وإعادة تشغيله.
إذا كنت تستخدم خادم RStudio server، فلن يتم إعادة تشغيل جلسة R الخاصة بك افتراضياً أبداً. عندما تغلق علامة تبويب خادم RStudio، قد تشعر وكأنك تغلق R، لكن الخادم يستمر في الواقع في تشغيله في الخلفية. في المرة القادمة التي تعود فيها، ستكون في نفس المكان الذي تركته تماماً. هذا يجعل من الأهمية بمكان إعادة تشغيل R بانتظام حتى تبدأ بصفحة بيضاء نظيفة.
6.2.2 أين يستقر تحليلك؟
تمتلك R مفهوماً قوياً يسمى مجلد العمل (working directory). هذا هو المكان الذي تبحث فيه R عن الملفات التي تطلب منها تحميلها، والمكان الذي ستضع فيه أي ملفات تطلب منها حفظها. يعرض RStudio مجلد العمل الحالي الخاص بك في أعلى شاشة التفاعل (console):

ويمكنك طباعة هذا في كود R عن طريق تشغيل getwd():
getwd()
#> [1] "/Users/hadley/Documents/r4ds"في جلسة R هذه، يكون مجلد العمل الحالي (فكر فيه كـ “المنزل”) في مجلد Documents الخاص بـ hadley، في مجلد فرعي يسمى r4ds. سيعيد هذا الكود نتيجة مختلفة عندما تقوم بتشغيله، لأن جهاز الكمبيوتر الخاص بك يحتوي على بنية مجلدات مختلفة عن بنية Hadley!
كمستخدم مبتدئ لـ R، لا بأس بالسماح لمجلد العمل الخاص بك بأن يكون مجلد الصفحة الرئيسية، أو مجلد المستندات، أو أي مجلد غريب آخر على جهاز الكمبيوتر الخاص بك. ولكنك أصبحت الآن على بعد أكثر من بضعة فصول في هذا الكتاب، ولم تعد مبتدئاً. قريباً جداً، يجب عليك الانتقال لتنظيم مشاريعك في مجلدات، وعند العمل على مشروع ما، اضبط مجلد العمل في R على المجلد المرتبط به.
يمكنك ضبط مجلد العمل من داخل R ولكننا لا نوصي بذلك:
setwd("/path/to/my/CoolProject")هناك طريقة أفضل؛ طريقة تضعك أيضاً على الطريق لإدارة عملك في R مثل الخبراء. هذه الطريقة هي مشروع آر ستوديو (RStudio project).
6.2.3 مشاريع آر ستوديو (RStudio projects)
إن الاحتفاظ بجميع الملفات المرتبطة بمشروع معين (البيانات المدخلة، سكربتات R، النتائج التحليلية، والأشكال) معاً في مجلد واحد هو ممارسة حكيمة وشائعة لدرجة أن RStudio يحتوي على دعم مدمج لهذا عبر المشاريع (projects). دعنا ننشئ مشروعاً لتستخدمه أثناء عملك في بقية هذا الكتاب. انقر فوق File > New Project، ثم اتبع الخطوات الموضحة في الشكل 6.3.
سمِّ مشروعك r4ds وفكر جيداً في المجلد الفرعي الذي تضع فيه المشروع. إذا لم تقم بتخزينه في مكان معقول، فسيكون من الصعب العثور عليه في المستقبل!
بمجرد اكتمال هذه العملية، ستحصل على مشروع RStudio جديد مخصص لهذا الكتاب فقط. تأكد من أن “منزل” مشروعك هو مجلد العمل الحالي:
getwd()
#> [1] /Users/hadley/Documents/r4dsالآن أدخل الأوامر التالية في محرر السكربتات، واحفظ الملف باسم “diamonds.R”. بعد ذلك، أنشئ مجلداً جديداً يسمى “data”. يمكنك القيام بذلك عن طريق النقر فوق زر “New Folder” في جزء Files في RStudio. أخيراً، قم بتشغيل السكربت الكامل والذي سيحفظ ملف PNG وملف CSV في مجلد مشروعك. لا تقلق بشأن التفاصيل، ستتعلمها لاحقاً في الكتاب.
اخرج من RStudio. افحص المجلد المرتبط بمشروعك — لاحظ وجود ملف .Rproj. انقر نقراً مزدوجاً فوق هذا الملف لإعادة فتح المشروع. لاحظ أنك تعود إلى حيث توقفت: إنه نفس مجلد العمل وتاريخ الأوامر، وجميع الملفات التي كنت تعمل عليها لا تزال مفتوحة. وبسبب اتباعك لتعليماتنا أعلاه، ستكون لديك بيئة عمل جديدة تماماً، مما يضمن أنك تبدأ بصفحة بيضاء نظيفة.
باستخدام الطريقة المفضلة لديك والخاصة بنظام التشغيل، ابحث في جهاز الكمبيوتر الخاص بك عن diamonds.png وستجد ملف PNG (ليس مفاجئاً) ولكن أيضاً السكربت الذي قام بإنشائه (diamonds.R). هذا فوز كبير! في يوم من الأيام، سيروق لك إعادة إنشاء شكل ما أو مجرد فهم من أين أتى. إذا قمت بحفظ الأشكال بدقة في ملفات باستخدام كود R وليس أبداً باستخدام الفأرة أو الحافظة (clipboard)، فستتمكن من إعادة إنتاج العمل القديم بكل سهولة!
6.2.4 المسارات النسبية والمطلقة
بمجرد أن تصبح داخل مشروع، يجب ألا تستخدم سوى المسارات النسبية (relative paths) وليس المسارات المطلقة (absolute paths). ما الفرق؟ المسار النسبي يكون نسبياً بالنسبة لمجلد العمل، أي منزل المشروع. عندما كتب هادلي data/diamonds.csv أعلاه، كان ذلك اختصاراً لـ /Users/hadley/Documents/r4ds/data/diamonds.csv. ولكن الأهم من ذلك، إذا قامت مينه (Mine) بتشغيل هذا الكود على جهاز الكمبيوتر الخاص بها، فإنه سيشير إلى /Users/Mine/Documents/r4ds/data/diamonds.csv. هذا هو سبب أهمية المسارات النسبية: فهي ستعمل بغض النظر عن المكان الذي ينتهي إليه مجلد مشروع R.
تشير المسارات المطلقة إلى نفس المكان بغض النظر عن مجلد العمل الخاص بك. وتبدو مختلفة قليلاً اعتماداً على نظام التشغيل الخاص بك. في نظام التشغيل Windows، تبدأ بحرف محرك الأقراص (مثل C:) أو بشرطتين مائلتين عكسيتين (مثل \\servername)، وفي أنظمة Mac/Linux تبدأ بشرطة مائلة “/” (مثل /users/hadley). يجب ألا تستخدم أبداً مسارات مطلقة في سكربتاتك، لأنها تعوق المشاركة: فلن يكون لدى أي شخص آخر نفس تكوين المجلدات تماماً مثلك.
هناك اختلاف مهم آخر بين أنظمة التشغيل: كيفية الفصل بين مكونات المسار. يستخدم نظام Mac و Linux الشرطات المائلة (مثل data/diamonds.csv) ويستخدم Windows الشرطات المائلة العكسية (مثل data\diamonds.csv). يمكن لـ R العمل مع أي من النوعين (بغض النظر عن المنصة التي تستخدمها حالياً)، ولكن لسوء الحظ، تعني الشرطات المائلة العكسية شيئاً خاصاً لـ R، وللحصول على شرطة مائلة عكسية واحدة في المسار، تحتاج إلى كتابة شرطتين مائلتين عكسيتين! هذا يجعل الحياة محبطة، لذا نوصي دائماً باستخدام أسلوب Linux/Mac مع الشرطات المائلة الأمامية (forward slashes).
6.3 تمارين
انتقل إلى حساب نصائح RStudio على منصة X (تويتر سابقاً)، https://twitter.com/rstudiotips وابحث عن نصيحة واحدة تبدو مثيرة للاهتمام. تدرب على استخدامها!
ما الأخطاء الشائعة الأخرى التي ستحددها أدوات الفحص والتشخيص في RStudio؟ اقرأ https://support.posit.co/hc/en-us/articles/205753617-Code-Diagnostics لمعرفة ذلك.
6.4 ملخص
في هذا الفصل، تعلمت كيفية تنظيم كود R الخاص بك في سكربتات (ملفات) ومشاريع (مجلدات). ومثل أسلوب كتابة الكود (code style)، قد يبدو هذا كأنه عمل روتيني غير ضروري في البداية. ولكن مع تراكم المزيد من الأكواد عبر مشاريع متعددة، ستتعلم كيف يمكن للتنظيم المسبق البسيط أن يوفر لك الكثير من الوقت في المستقبل.
باختصار، تمنحك السكربتات والمشاريع سير عمل متين سيخدمك جيداً في المستقبل:
- أنشئ مشروع RStudio واحداً لكل مشروع تحليل بيانات.
- احفظ سكربتاتك (بأسماء توضيحية) في المشروع، وعدلها، وشغلها في أجزاء أو ككل. أعد تشغيل R بشكل متكرر للتأكد من أنك قمت بتسجيل كل شيء في السكربتات الخاصة بك.
- لا تستخدم أبداً سوى المسارات النسبية، وليس المسارات المطلقة.
عندها سيكون كل ما تحتاجه في مكان واحد ومنفصلاً بشكل نظيف عن جميع المشاريع الأخرى التي تعمل عليها.
حتى الآن، عملنا مع مجموعات بيانات مدمجة داخل حزم R. يسهل هذا الحصول على بعض الممارسة على بيانات معدة مسبقاً، ولكن من الواضح أن بياناتك لن تكون متاحة بهذه الطريقة. لذلك، في الفصل القادم، ستتعلم كيفية تحميل البيانات من القرص الصلب إلى جلسة R الخاصة بك باستخدام حزمة readr.
ناهيك عن أنك تتحدى القدر باستخدام كلمة “final” (نهائي) في الاسم 😆 تحتوي سلسلة الرسوم الهزلية Piled Higher and Deeper على شريط فكاهي ممتع حول هذا الأمر.↩︎
إذا لم تكن حزمة usethis مثبتة لديك، يمكنك تثبيتها باستخدام
install.packages("usethis").↩︎