*

*

ما هي لغة R؟

كانت بداية R أكثر من عادية عندما حاول “Ross Ihaka” (من جامعة أوكلاند بنيوزيلاندا) إعادة كتابة بعض الدوال الإحصائية بلغة S بواسطة اسكيم “Scheme ” . ولغة S هذه هي أولى اللغات المختصة بالحوسبة الإحصائية التي وقع تطويرها في مختبرات “AT&T” في سبعينات القرن الماضي كبديل لفورتران. و في البداية كانت مختبرات “AT&T” تقوم بتوزيع مصدر لغة S (كما كانت تفعل مع النسخ الأولى لنظام يونكس)، قبل أن تغير رخصته إلى تجاري ومغلق سنة 1984. وعندما عرض “Ross Ihaka” على زميله “Robert Gentleman” نتائج محاولاته، قرر الاثنان إعادة كتابة “Implementation” مصدر S بالكامل بواسطة فرتران وسي. ونشرت أول نسخة حاملة الحرف الأول من اسميهما (R) تحت بنود رخصة غنو الحرّة سنة1997. وبوتيرة تطوير متسارعة صار المشروع ناضجا منذ سنة 2000، وهو الآن من الشهرة في الأوساط الأكاديمية، بحيث أنه تجاوز بمراحل إمكانيات لغة S ولغات أخرى مختصة بهذا المجال.

*

“GNU R” أو المعروفة اختصارًا ب R هي لغة وبيئة تطوير (Language and development environment) متخصصة في تحليل وتمثيل البيانات والحوسبة الإحصائية. وتتكون R من حزمة رئيسية “core” يمكن توسيعها بواسطة حزم أخرى موجودة بمستودعات المشروع الرئيسي “CRAN”. يبلغ عدد هذه الحزم لحد الآن 2456. وهي تقدم مكتبات للطرق الإحصائية الأساسية والمقدمة كالإحصاء الوصفي، والاختبارات الإحصائية، وتخطيط التجارب، وتحليل الارتباطات الخطية، واللاخطية، وتحليل المتتاليات الزمنية، والتحليل متعدد المتغيرات، وتحليل الإشارات، … وبقية القائمة المفصّلة ستجدها هنا.
*
في السنوات العشر الأخيرة، تجاوزت R الدوائر الأكاديمية إلى قطاعات تكنولوجية متعددة حيث تقوم باستعمالها شركات كبرى بما في ذلك غوغل ومايكروسوفت وموقع فايسبوك (لتحليل البيانات الشخصية). ثم إن شركات أدوية عالمية (AstraZeneca ،Pfizer،Johnson & Johnson ، …) تعتمده لتحليل البيانات السريرية.

*
للمزيد من المعلومات تفضل بزيارة موقع مشروع R.

*

ما هي مميزات R؟

  •   مجانية، مفتوحة المصدر، ومتاحة للجميع.
  •   متعددة المنصات يعمل على أنظمة لينوكس ويونكس وماك وويندوز.
  •   مختصة في التحليل الإحصائي وبنائها “syntax ” سهل ملائم جدا لهذه الغاية، مثلا لحساب المجموع والمعدل والتباين. أستعمل أوامر بديهية مثل:mean, sum, var
  • تعتمد فلسفة البساطة والحد الأدنى، أي أنها تعطيك المخرجات التي تحتاجها فقط وتتفادى تكديس النتائج كما تفعل برمجيات إحصائية أخرى ( كتقارير SPSS).
  • لغة مفسرة ولغة لكتابة السكربتات مثل بايثون.
  •   ذات أداء عال وقابلة للموازاة (Parallel computing) وهو أمر هام لعمليات حوسبة معقدة مثل نمذجة ومحاكاة المناخ والنظم الأحيائية، … لتمثيل بياني ذو جودة عالية مع إمكانية إنتاج مخططات ثلاثية الأبعاد باستعمال مكتبة “OpenGL”.
  • نظام وثائق ودعم محكم ومتنوع.

*

ماهي حدود R؟

طبعا لنكون واقعيين لكل لغة برمجة حدود، فمن الواضح أنك لن تستطيع مثلا عمل لعبة ثلاثية الأبعاد بواسطة R كما أنك لن تستطيع حل كل المشاكل الرياضية وتحليل جميع أنواع البيانات.

*
- لتحليل الأطياف والإشارات (Signal processing) ومحاكاة النظم الإلكترونية سيكون من الأفضل استعمال لغات الحوسبة العددية مثل متلاب (التجارية) أو بديل مفتوح المصدر مثل أوكتاف “Octave ” أو سيلاب “Scilab  “.

.
-بما أنها لغة مفسرة، ستكون R أبطأ في بعض البرامج الضخمة وذات البنية معقدة. في هذه الحالة، إذا كانت السّرعة أمرا حيويًا، يتجه الكثيرون نحو لغات مصرّفة “Compiled” مثل “SAS” أو فورتران.

.
- قد تكون ذاكرة R غير مهيأة لتعامل مع بيانات ذات سعة فائقة لأنها تقوم بتحميل كافة البيانات والمكتبات في الذاكرة الحيّة (وإن كان هناك تحسينات منذ الإصدار. 2). الحلّ المتوفر هو إنشاء قاعدة بيانات خارجية وربطها ب R (باستعمال MySQL، أو PostgreSQL، أو غيرها).

*

تثبيت واستعمال R على لينكس

هناك إصداران من R كل سنة، في أبريل وأكتوبر. سنستخدم الإصدار الأحدث في هذا الشرح وهو 2.11. الحزم التنفيذية “Binaries” متاحة للتحميل من الموقع الرئيسي، وكذلك تثبيتها من مدير حزم مباشرة متاح لأغلب التوزيعات.

*

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

*

افتح الطرفية، وتأكد من أنك تحمل صلاحيات الجذر، ثم أكتب أوامر التثبيت:
- على دبيان وأوبنتو وسبيلي ومينت:

كود:
apt-get install r-base r-base-dev

.
- على فيدورا وأعجوبة لينكس:

كود:
yum install R R-devel

.
- على مندريفا:

كود:
urpmi R-base R-devel

.
- على أوبن سيوز:

كود:
zypper install R-base R-base-devel
.

*

للتعليمات الخاصة بالتثبيت من المصدر أنظر هنا.

 تستطيع العمل على بيئة R بشكل أساسي بواسطة سطر الأوامر كما أن هناك واجهات رسومية عديدة (سنرى بعضها لاحقا). من الممكن أيضا دمجها مع تطبيقات أخرى كالمتصفحات (بواسطة “rapache”) والجداول الممتدة “spreadsheets” أو جعلها تعمل كخادم (بواسطة “Rserve”).

 لفتح جلسة R جديدة، أكتب في الطرفية:

كود:
~$ R
 إذا كان كل شيء على ما يرام سترى رسالة ترحيب كالتالي
*

                    فتح R على الطرفية (الواجهة النصيّة).
.
 والعلامة التنصيص ">" هي استدعاء لنا لبداية إدخال الأوامر، مثلا لندخل عملية بسيطة:
كود PHP:
>7+28
 .
والمخرجة ستكون:
كود PHP:
[1] 35
 .
للخروج من الجلسة أكتب
كود PHP:
q()
 .
سيطلب منك إن كنت تريد حفظ بيانات الجلسة الحالية أم لا (y/n) فاختر ما تراه مناسباً. 
. 
 هذه الطريقة، التي لا تعتبر غريبة على من يتعامل مع "بيثون" و"روبي" ، تسمى " Console mode ".
 يمكنك أيضا عمل سكربتات بلغة R وتنفيذها عن طريق " Batch mode " وكتجربة افتح محرر النصوص لديك ثم أنقل وألصق التالي:
.
كود PHP:
#!/usr/bin/env R
cat("Hello World!\n")
 .

 إحفظ الملف بامتداد " .R" ثم لرؤية النتيجة أكتب في الطرفية:
.
كود PHP:
~$ cat hello.R | R --slave
Hello World!
 *

 لنبدأ !  Getting Started  

 في البداية ستستعمل R كآلة حاسبة. جرب أشياء كالتالي: 
.
كود PHP:
> 3+7-3#  addition and subtraction
[1] 7
 .
 لاحظ هنا أمرين:
 أولاً، أجريت العملية الحسابية ولكن وقع تجاهل كل ماهو مكتوب بعد العلامة "#" لأنه يعتبر تعليقا. كتابة التعليقات مهمة جداً في أي لغة برمجة لأنك قد تكون أول من سينسى طريقة عمل الكود بعد أشهر من كتابته. 
 ثانيًا، طبعت قبل النتيجة العلامة "[1]" وهذا لأن R يعتبر افتراضيا كل شيء بمثابة جدول "vector" والرقم واحد هو مؤشر عن العنصر الأول في الجدول.
.
كود PHP:
> 6-3+2
[1] 5
> 6-(3+2) # operation order
[1] 1
> 12*6+4# multiplication first
[1] 76
> 72/5 # division
[1] 14.4
> 6^2 # squaring
[1] 36
> 8^13 # to the power of
[1] 549755813888
> 8**13 # same thing
[1] 549755813888
> ((5*13)-(1+4)^2)/62 # more complicated
[1] 0.6451613
 .
 تستطيع أيضا استعمال بعض الدوال الرياضية، مثلا:
.
كود PHP:
> sqrt(2) # square root
[1] 76
> cos(pi) # cosine of pi, pi is the ‘π’ constant
[1] -1
> sin(20)^2+cos(20)^2
[1] 1
> log(1) # natural log
[1] 0
> log10(10) # decimal log
[1] 1
> exp(0) # exponential
[1] 1
 .
 يمكن تخزين المتغيرات باسم معين:
.
كود PHP:
> x<-5 # assigns 5 to x
>x=5 # equivalent but not recommended for scripts
.
كما ترى R ليس كثير الكلام ، لو أردت أن تطبع قيمة المتغير (ما تحتويه x هنا) :
.
كود PHP:
> x # print x’s value
[1] 5
> 2 -> y # same thing, assigns 2 to y
> y
[1] 2
> z<- x*y-x+y
[1] 7
 .
 لإنشاء الجداول:
كود PHP:
> v<-c(1,2,3,4) # create a vector with combine function “c()”
> v
[1] 1  2  3  4
> w<-c("Age","Gender","Length") # create a vector of strings
> w
[1] "Age"  "Gender"  "Length"
> v<-1:10 # create a vector with a sequence from 1 to 10
> v
[1] 1  2  3  4  5  6  7  8  9 10
> v<-seq(1,10) # same thing with “seq()” function
> v
[1] 1  2  3  4  5  6  7  8  9 10
> u<-sin(v) #calculate sin of v elements and assign them to a new vector u
> u # display u
[1]  0.8414710  0.9092974  0.1411200 -0.7568025 -0.9589243 -0.2794155
[7]  0.6569866  0.9893582  0.4121185 -0.5440211
 .
 كمثال بسيط سنقوم برسم منحنى دالة الجيب كالآتي:
.
كود PHP:
> v<-seq(-6,6,.2) # create a sequence from -6,6 with an increment of 0.2
> u<-sin(v)
> plot(v,u,type='l',col='red')# plot u=sin(v) with a red line ‘l’
.
 والنتيجة ستكون:

.
الرسم البياني لدالة الجيب.
 كما ترى من المثال السابق، الدوال"functions"فيR تأتي على الشكل التالي:
.
كود PHP:
function(arg1=…,arg2=…,…) # function with some arguments
 .
 هناك العديد من الملقمات "arguments " في الدالة ()plot، بعضها أساسي والآخر اختياري. قمنا هنا بتحديد أربعة منها فقط.
 في الأول والثاني قمنا بتحديد البيانات v و u التي سنقوم بتمثيلها في المنحنى (أساسي).
 في الثالث والرابع قمنا اختياريا بتحديد نوع المنحنى"type=" ولونه "col="، وإن كان من الممكن تركهما دون تحديد. 

 .
يمكنك أن تطلب المساعدة لمعرفة طريقة استعمال أي دالة كالتالي:
.
كود PHP:
> help(plot)# display help of plot function in console mode
> ?plot # same thing
 .
 لتصفح المساعدة بشكل أفضل على متصفح الويب (على Firefox مثلا)، قم فقط بتغيير الخيارات كالآتي:
.
كود PHP:
> options(help_type = "html", browser = "firefox")
> help(plot)
.


.
وثائق المساعدة على المتصفح موزيلا فايرفوكس.
 .
ويمكن أيضا استعراض كل الملقمات المتوفرة لدالة معينة بواسطة المفتاح "tab"، تماما كما تعمل خاصية الإتمام الذاتي على الطرفية. على سبيل المثال:
.
كود PHP:
> plot()
topic=            package=          lib.loc=          verbose=
try.all.packages= help_type=
...