1 / 200 * 30
#> [1] 0.15
(59 + 73 + 2) / 3
#> [1] 44.66667
sin(pi / 2)
#> [1] 12 بيئة العمل: الأساسيات
لقد اكتسبت الآن بعض الخبرة في تشغيل أكواد R. لم نزوّدك بالكثير من التفاصيل بعد، ولكن يبدو أنك استوعبت الأساسيات بوضوح، وإلا لكنت قد ألقيت بهذا الكتاب جانباً بداعي الإحباط! إن الشعور بالإحباط أمر طبيعي تماماً عند بدء البرمجة باستخدام R، نظراً لأنها لغة شديدة الدقة والصرامة فيما يتعلق بعلامات الترقيم، فحتى لو كان هناك رمز واحد فقط في غير مكانه، فستبدأ اللغة بالشكوى وإظهار الأخطاء. ولكن، في حين أنه يجب عليك أن تتوقع قليلاً من الإحباط، فلتطمئن وتتذكر أن هذه التجربة نمطية ومؤقتة؛ فهي تحدث للجميع دون استثناء، والسبيل الوحيد لتجاوزها هو الاستمرار في المحاولة.
وقبل أن نمضي قدماً، دعنا نضمن امتلاكك لأساس متين في تشغيل أكواد R، ومعرفتك ببعض الميزات الأكثر فائدة في بيئة RStudio.
2.1 أساسيات كتابة الكود
دعنا نراجع بعض الأساسيات التي أغفلناها حتى الآن رغبةً في تمكينك من رسم المخططات البيانية بأسرع وقت ممكن. يمكنك استخدام R لإجراء العمليات الحسابية الأساسية:
ويمكنك إنشاء كائنات (Objects) جديدة باستخدام معامل التخصيص أو الإسناد <-:
x <- 3 * 4لاحظ أن قيمة x لم تُطبع على الشاشة، بل تم تخزينها فحسب. وإذا كنت ترغب في استعراض هذه القيمة، فاكتب x في شاشة وحدة التحكم (Console).
ويمكنك دمج عناصر متعددة في متجه (Vector) واحد باستخدام الدالة c():
primes <- c(2, 3, 5, 7, 11, 13)وعند إجراء العمليات الحسابية الأساسية على المتجهات، فإنها تُطبَّق على كل عنصر من عناصر المتجه:
primes * 2
#> [1] 4 6 10 14 22 26
primes - 1
#> [1] 1 2 4 6 10 12إن جميع جمل R التي تقوم فيها بإنشاء كائنات—أي جمل التخصيص/الإسناد (Assignment)—تأخذ الصياغة الموحدة التالية:
object_name <- valueوعند قراءتك لهذا الكود، ردد في ذهنك عبارة: “اسم الكائن يتلقى القيمة” (object name gets value).
سوف تقوم بإجراء الكثير من عمليات التخصيص، وكتابة الرمز <- يدويًّا قد تكون مزعجة وتستغرق وقتًا. لذا، يمكنك توفير الوقت باستخدام اختصار لوحة المفاتيح في RStudio: Alt + - (علامة الطرح). ستلاحظ أن RStudio يضع تلقائيًّا مسافات قبل وبعد معامل التخصيص <-، وهو ما يعد ممارسة ممتازة في تنسيق الأكواد. قراءة الأكواد البرمجية قد تكون مرهقة للعين في الأيام العادية، لذا أرح عينيك واستخدم المسافات الفاصلة (Spaces).
2.2 التعليقات
سيتجاهل برنامج R أي نص يأتي بعد علامة المربع # في ذلك السطر. يتيح لك ذلك كتابة التعليقات (Comments)، وهي نصوص يتجاهلها المحرك ولكن يقرأها البشر الآخرون. سنقوم أحياناً بتضمين تعليقات في الأمثلة لشرح ما يحدث داخل الكود.
يمكن أن تكون التعليقات مفيدة لوصف ما يفعله الكود التالي باختصار:
# create vector of primes
# إنشاء متجه للأعداد الأولية
primes <- c(2, 3, 5, 7, 11, 13)
# multiply primes by 2
# ضرب الأعداد الأولية في 2
primes * 2
#> [1] 4 6 10 14 22 26ومع الأكواد القصيرة مثل هذه، قد لا يكون ترك تعليق لكل سطر كود أمراً ضرورياً. ولكن كلما زاد الكود الذي تكتبه تعقيداً، يمكن للتعليقات أن توفر عليك (وعلى زملائك الباحثين والمشاركين معك) الكثير من الوقت والجهد لمعرفة ما تم إنجازه في الكود.
استخدم التعليقات لشرح “سبب” (why) كتابة الكود بهذا الشكل، وليس “كيف” (how) أو “ماذا” (what) يفعل الكود. فمن الممكن دائماً استنتاج “ماذا” و”كيف” يعمل الكود—حتى وإن كان ذلك مملاً—من خلال قراءته بعناية. أما إذا قمت بوصف كل خطوة في التعليقات، ثم قمت بتعديل الكود لاحقاً، فسيتعين عليك تذكر تحديث التعليقات أيضاً، وإلا ستصبح مربكة ومضللة عندما تعود إلى كودك في المستقبل.
إن معرفة “سبب” القيام بأمر ما هي الأكثر صعوبة، إن لم تكن مستحيلة في بعض الأحيان دون تعليق. على سبيل المثال، تحتوي الدالة geom_smooth() على وسيط (Argument) يُسمى span، والذي يتحكم في مدى ملاسة المنحنى، حيث تؤدي القيم الأكبر إلى منحنى أكثر ملاسة. لنفترض أنك قررت تغيير قيمة span من قيمتها الافتراضية 0.75 إلى 0.9؛ سيكون من السهل على أي قارئ مستقبلي فهم ما الذي حدث، ولكن ما لم توضح طريقة تفكيرك في تعليق، فلن يفهم أحد سبب تغييرك للقيمة الافتراضية.
أما بالنسبة لأكواد تحليل البيانات، فاستخدم التعليقات لشرح خطتك العامة في معالجة البيانات، ولتوثيق الرؤى والاستنتاجات الهامة فور توصلك إليها؛ إذ لا توجد طريقة لاسترجاع هذه المعرفة من الكود نفسه.
2.3 ماذا يوجد في الاسم؟
يجب أن تبدأ أسماء الكائنات بحرف، ويمكنها فقط أن تحتوي على حروف، وأرقام، والشرطة السفلية _، والنقطة .. ونظراً لأنك تريد أن تكون أسماء كائناتك وصفية ودالة على محتواها، فستحتاج إلى اعتماد اتفاقية محددة للتسمية عند وجود كلمات متعددة. نحن نوصي باستخدام نمط snake_case، حيث تفصل بين الكلمات المكتوبة بحروف صغيرة باستخدام الشرطة السفلية _.
i_use_snake_case
otherPeopleUseCamelCase
some.people.use.periods
And_aFew.People_RENOUNCEconventionسوف نعود إلى موضوع الأسماء مجدداً عند مناقشة أسلوب كتابة وتنسيق الكود في الفصل 4.
يمكنك فحص الكائن والتحقق من محتواه عن طريق كتابة اسمه فقط:
x
#> [1] 12دعنا نجرِ عملية تخصيص أخرى:
this_is_a_really_long_name <- 2.5لفحص هذا الكائن، جرب ميزة الإكمال التلقائي في RStudio: اكتب “this”، ثم اضغط على زر TAB، وأضف أحرفاً حتى يصبح لديك بادئة فريدة تميز الاسم، ثم اضغط على زر Enter.
لنفرض الآن أنك ارتكبت خطأً، وأن قيمة الكائن this_is_a_really_long_name يجب أن تكون 3.5 وليست 2.5. يمكنك استخدام اختصار آخر لوحة المفاتيح لمساعدتك في تصحيح ذلك؛ على سبيل المثال، يمكنك الضغط على السهم لأعلى ↑ لاستدعاء الأمر الأخير الذي كتبته وتعديله. أو اكتب “this” ثم اضغط على زر Cmd/Ctrl + ↑ لعرض قائمة بجميع الأوامر التي كتبتها والتي تبدأ بتلك الأحرف. استخدم أسهم لوحة المفاتيح للتنقل بينها، ثم اضغط على enter لإعادة كتابة الأمر. قم بتغيير 2.5 إلى 3.5 وأعد تشغيل الكود.
دعنا نجرِ تخصيصاً آخر أيضاً:
r_rocks <- 2^3ولنحاول الآن فحص هذا الكائن:
r_rock
#> Error: object 'r_rock' not found
R_rocks
#> Error: object 'R_rocks' not foundيوضح هذا المثال العقد الضمني والاتفاق غير المكتوب بينك وبين لغة R: سوف تقوم R بالعمليات الحسابية المملة والمعقدة نيابة عنك، ولكن في المقابل، يجب أن تكون دقيقاً تماماً في تعليماتك وأوامرك. وإذا لم تكن كذلك، فمن المحتمل جداً أن تتلقى خطأً يخبرك بأن الكائن الذي تبحث عنه لم يتم العثور عليه (not found). الأخطاء الإملائية (Typos) لها عواقبها؛ إذ لا يمكن لـ R قراءة عقلك والقول: “أوه، ربما كان يقصد r_rocks عندما كتب r_rock”. كما أن حالة الأحرف (كبيرة أم صغيرة - Case sensitivity) مهمة جداً؛ فبالمثل، لا تستطيع R قراءة عقل المبرمج والقول: “أوه، يبدو أنه كان يقصد r_rocks عندما كتب R_rocks”.
2.4 استدعاء الدوال
تحتوي لغة R على مجموعة واسعة وضخمة من الدوال المضمنة داخلياً (Built-in functions) والتي يتم استدعاؤها على النحو التالي:
function_name(argument1 = value1, argument2 = value2, ...)دعنا نجرّب استخدام الدالة seq()، والتي تقوم بإنشاء متتاليات منتظمة من الأعداد (sequences)، وأثناء قيامنا بذلك، سنتعلم المزيد من الميزات المفيدة في RStudio. اكتب se ثم اضغط على زر TAB. ستظهر لك نافذة منبثقة تعرض الإكمالات الممكنة للاسم. حدد الدالة seq() بكتابة حرف إضافي (حرف q) لإزالة الغموض أو باستخدام الأسهم أعلى/أسفل ↑/↓ للاختيار. لاحظ تولد تلميح أداة عائم (Tooltip) يذكرك بوسيطات الدالة والغرض منها. وإذا كنت تريد مزيداً من المساعدة، فاضغط على زر F1 لفتح كافة التفاصيل في تبويب المساعدة (Help) في الجزء السفلي الأيمن من واجهة البرنامج.
عندما تختار الدالة التي تريدها، اضغط على زر TAB مجدداً. سيقوم RStudio بإضافة قوسي الفتح والإغلاق المتطابقين (( و )) نيابة عنك. اكتب اسم الوسيط الأول، from، واجعله مساوياً لـ 1. ثم اكتب اسم الوسيط الثاني، to، واجعله مساوياً لـ 10. وأخيراً، اضغط على زر Enter لتنفيذ الأمر.
seq(from = 1, to = 10)
#> [1] 1 2 3 4 5 6 7 8 9 10غالباً ما نحذف أسماء الوسيطات القليلة الأولى عند استدعاء الدوال، وبناءً عليه، يمكننا إعادة كتابة الأمر السابق باختصار على النحو التالي:
seq(1, 10)
#> [1] 1 2 3 4 5 6 7 8 9 10اكتب الكود التالي ولاحظ كيف يقدم RStudio مساعدة مماثلة مع علامات الاقتباس المزدوجة المتطابقة:
x <- "hello world"يجب دائماً أن تأتي علامات الاقتباس والأقواس في أزواج متطابقة (بداية ونهاية). يبذل RStudio قصارى جهده لمساعدتك، ولكن لا يزال من الممكن ارتكاب خطأ والوقوع في عدم تطابق بينها. إذا حدث هذا، فسيعرض لك R رمز الاستمرار وهو علامة الزائد “+”:
> x <- "hello
+
تخبرك علامة + أن R ينتظر منك مزيداً من المدخلات؛ فهو لا يعتقد أنك انتهيت من كتابة الجملة بعد. وعادةً ما يعني هذا أنك نسيت إما علامة اقتباس " أو قوس إغلاق ). فإما أن تقوم بإضافة الرمز المفقود لإغلاق الجملة، أو تضغط على زر ESCAPE لإلغاء الأمر بأكمله والمحاولة مرة أخرى.
لاحظ أن تبويب البيئة (Environment) في الجزء العلوي الأيمن من واجهة البرنامج يعرض جميع الكائنات التي قمت بإنشائها وتخزينها حتى الآن:

2.5 تمارين
-
لماذا لا يعمل هذا الكود البرمجي؟
my_variable <- 10 my_varıable #> Error: #> ! object 'my_varıable' not foundانظر بعناية شديدة! (قد يبدو هذا التمرين بلا جدوى في ظاهر الأمر، لكن تدريب عقلك على ملاحظة أدق الفروق والاختلافات سيؤتي ثماره بشكل كبير عند البرمجة لاحقاً).
-
قم بتعديل كل أمر من أوامر R التالية بحيث يتم تشغيلها بشكل صحيح وسليم:
libary(todyverse) ggplot(dTA = mpg) + geom_point(maping = aes(x = disply = hwy)) + geom_smooth(method = "lm") اضغط على أزرار الاختصار التالية في لوحة المفاتيح: Option + Shift + K (لمستخدمي الماك) أو Alt + Shift + K (لمستخدمي الويندوز). ما الذي يحدث؟ وكيف يمكنك الوصول إلى نفس المكان باستخدام القوائم العلوية للبرنامج؟
-
دعنا نعد مجدداً إلى تمرين من قسم 1.6. قم بتشغيل أسطر الكود التالية. أي من المخططين البيانيين سيتم حفظه باسم
mpg-plot.png؟ ولماذا؟my_bar_plot <- ggplot(mpg, aes(x = class)) + geom_bar() my_scatter_plot <- ggplot(mpg, aes(x = cty, y = hwy)) + geom_point() ggsave(filename = "mpg-plot.png", plot = my_bar_plot)
2.6 ملخص
لقد تعلمت الآن المزيد عن كيفية عمل أكواد R، واكتسبت بعض النصائح التي ستساعدك على فهم كودك والتعرف عليه بسهولة عندما تعود إليه في المستقبل. في الفصل القادم، سنواصل رحلتك الشائقة في علم البيانات من خلال تعليمك دالة وحزمة dplyr ؛ وهي حزمة أساسية ضمن منظومة tidyverse تساعدك على تحويل وتشكيل البيانات (Data transformation)، سواء كان ذلك باختيار متغيرات مهمة، أو تصفية البيانات للوصول إلى صفوف محددة تهمك، أو حساب الإحصاءات الوصفية والملخصات الإحصائية.