بسیاری از زبانها روشی مانند null یا none دارند تا یک مقدار ناموجود را نشان دهند.
چون R برای کار با حجم زیادی از دادههای (اغلب بههمریخته) طراحی شده است، چندین شکل از «هیچبودن» دارد.
هدف کلی این است که مقادیر گمشده یا مشکوک بهمحض روبهرو شدن، علامتگذاری شوند و سپس بدون ایجاد استثنا ادامه یابد.
اگر یک مقدار واقعاً وجود نداشته باشد، با 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 استفاده میشود. برای مثال، هنگام شمارش خودروهایی که در یک جاده در حال حرکتاند، ممکن است ناظران انسانی بیمار شوند یا حسگرهای خودکار از کار بیفتند، اما ترافیک همچنان در جریان باشد.
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
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)