ال

اللاشيء في R

1 تمرين

نبذة عن اللاشيء

تحتوي لغات كثيرة على طريقة مثل null أو none للإشارة إلى قيمة غير موجودة. ولأن R مصمَّمة للتعامل مع كميات كبيرة من البيانات (التي غالبًا ما تكون غير منظمة)، فإنها تمتلك أشكالًا متعددة من العدم.

الهدف العام هو الإشارة إلى القيم المفقودة أو المشكوك فيها عند مواجهتها، ثم المتابعة دون رفع استثناء.

NULL

إذا كانت القيمة غير موجودة فعلًا، فإنها تُمثَّل بـ NULL. وهذا على الأرجح أقرب ما يشبه ما تفعله C أو Python.

v <- c() # zero-length vector
v
#> NULL
is.null(v)
#> [1] TRUE

في سياقات كثيرة، تُتجاهل قيم NULL ببساطة:

c(2, 3, NULL, 5)
#> [1] 2 3 5

NA

في الحالات التي تكون فيها القيمة موجودة لكننا لا نعرف ما هي، تُستخدم NA. على سبيل المثال، عند إحصاء المركبات التي تسير على طريق، قد يمرض المراقبون البشريون أو تتعطل المستشعرات الآلية، لكن حركة المرور تستمر.

v <- c(1, 2, NA, 4, 5)
v
#> [1]  1  2 NA 4  5
is.na(v) # test for data gaps
#> [1] FALSE FALSE  TRUE FALSE FALSE

وهكذا فإن NA عنصر نائب ينبّه البشر إلى أنهم بحاجة إلى اتخاذ قرار بشأن كيفية التعامل معها.

عادةً ما تُرجع الدوال الإحصائية القيمة NA افتراضيًا إذا وُجدت قيم NA. وإذا أردت تجاهل هذه القيم، فاستخدم المعامل na.rm (أي إزالة قيم NA) لجعل ذلك صريحًا:

v <- c(1, 2, NA, 4, 5)
mean(v)
#> [1] NA
mean(v, na.rm = TRUE)
#> [1] 3

NaN

NaN اختصار لعبارة «Not a Number»، وهي تُشير إلى مشكلة في عملية حسابية في الحالات التي كان يُتوقع فيها عدد.

n <- c(0, 2, 4)
d <- c(0, 1, 2)
n / d
#> [1] NaN   2   2  # 0/0 is mathematically undefined
is.nan(n / d)
#> [1]  TRUE FALSE FALSE

ليست هذه الاحتمال الوحيد للحسابات «غير الصالحة». فالقسمة على صفر تُرجع Inf أو -Inf عندما يكون البسط غير صفر، دون رفع خطأ.

1 / 0
#> [1] Inf

المتجهات الفارغة

وربما يكون من المفاجئ أن R لا تملك طريقة قياسية للتحقق من الفراغ، رغم أن بعض حزم الطرف الثالث تنفّذ دوالها الخاصة مثل is.empty().

وحتى إنشاء متجه فارغ ليس أمرًا بديهيًا تمامًا. رأينا في قسم سابق أن c() بلا وسائط تُرجع NULL، وليس متجهًا.

is.vector(c())
#> [1] FALSE

وتأخذ دوال مثل logical() أو integer() وسيطًا يحدد الطول المطلوب، والذي يمكن أن يكون صفرًا.

z <- logical(0)
is.vector(z)
#> [1] TRUE
length(z)
#> [1] 0

ويمكننا أيضًا إنشاء متجه ثم إزالة كل عنصر فيه، كما هو موضح في مفهوم المتجهات. وينتج عن ذلك متجه طوله صفر من النوع المناسب.

v <- 5
v[-1]  # delete the first element
#> numeric(0)
تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة

تعلّم اللاشيء