R لغة ذات أنواع ديناميكية، لذا لا يلزم عمومًا تحديد نوع المتغير. النوع الافتراضي هو numeric، ويُنفَّذ عادةً كعدد عشري مزدوج الدقة. ولإجبار استخدام أعداد صحيحة بطول 32 بت، استخدم اللاحقة L (اختصار لكلمة Long).
الحصول على «نوع» كائن ما قد يكون مربكًا (لأسباب تاريخية).
الدالتان typeof() وclass() متشابهتان، لكنهما قد تُرجعان نتائج مختلفة قليلًا:
typeof(50)
#> [1] "double" # more specific: an implementation detail
typeof(50L)
##> [1] "integer"
class(50)
#> [1] "numeric" # less specific: ignores implementation details
class(50L)
#> [1] "integer"
قد تصادف أيضًا إشارات إلى mode()، وهي مشابهة لـ typeof().
يُرجى تجاهل mode() وstorage.mode().
فهي مُوفَّرة فقط للتوافق مع الإصدارات السابقة.
عامل الإسناد المفضّل هو <-.
وإذا كنت تعمل في RStudio، فيمكنك إدخاله باختصار لوحة المفاتيح Alt-minus.
x <- 42
avogadro <- 6.02e23
mystr <- "Hello, World!"
استخدام = بدلًا من <- سينجح غالبًا لكن ليس دائمًا، ولا يُنصح به لأنه أسلوب رديء.
العوامل متشابهة في الغالب مع كثير من اللغات الأخرى، إلا أن %% و%/% أكثر غرابة.
صيغة % هذه طريقة لاستدعاء عوامل تُنفَّذ كوحدات ماكرو وتُكتب بين معاملاتها.
2 + 3 # 5
2 - 3 # -1
2 * 3 # 6
2 / 3 # 0.6666667
8 %/% 3 # 2 (integer division)
8 %% 3 # 2 (remainder)
2 ^ 3 # 8 (exponential)
في R، تبدأ # تعليقًا من سطر واحد.
ولا توجد صيغة منفصلة للتعليقات متعددة الأسطر.
لتعريف دالة:
squareit <- function(x) {
x * x
}
يمكن أن تحتوي الدالة على صفر أو أكثر من الوسائط، مفصولة بفواصل.
يلزم استخدام الأقواس الهلالية () مع function()، حتى لو لم توجد معاملات.
يمكن تحديد قيم افتراضية لوسائط الدالة، لكن يجب أن تأتي هذه بعد أي وسائط بلا قيم افتراضية، ومع استخدام = وليس <- لإسناد القيمة الافتراضية.
وكمثال لا طائل منه تقريبًا:
squareit <- function(x = 42) {
x * x
}
squareit()
#> [1] 1764
الأقواس المعقوفة { } ليست مطلوبة بالضرورة لأجسام الدوال المكوّنة من سطر واحد، لكن تضمينها يُعدّ أسلوبًا جيدًا.
في R، تُرجع الدالة قيمتها النهائية تلقائيًا، كما في الأمثلة أعلاه.
يمكن استخدام return() في أي مكان داخل جسم الدالة لجعل قيمة الإرجاع صريحة.
فهي تُرجع القيمة المحددة فورًا، وتُنهي الدالة دون تنفيذ أي من التعبيرات المتبقية في جسم الدالة.
عادةً لا يلزم استدعاء return() صراحةً إلا إذا أردت الخروج من الدالة مبكرًا وإرجاع قيمة محددة لسبب ما.
وقد يكون مثال ذلك داخل جملة if-else.
غير أن بعض المطوّرين يفضّلون الإرجاع الصريح كمسألة أسلوب برمجي.
استدعاء الدالة يشبه ما هو عليه في كثير من اللغات الأخرى:
squareit(3)
#> [1] 9
سنرى في مفاهيم لاحقة أن النتيجة 9 هي في الواقع متجه بطول 1 وليس عددًا قياسيًا.
ومن هنا تضمين [1] للإشارة إلى أن هذه بداية المتجه.
is.vector(9)
#> [1] TRUE
معظم الأشياء في R هي نوع من المتجهات!
ستعرض وحدة تحكم R المثال أعلاه هكذا:
> squareit(3)
[1] 9
تتبع مستندات هذا المنهج في الغالب العُرف المستخدم في عدة كتب مدرسية عن R، بحذف علامة الأمر وتعليق النتيجة. وهذا يسهّل نسخ أمثلة الكود ولصقها في وحدة التحكم وتشغيلها.