پو

پوچی در 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 که کوتاه‌شده‌ی عبارت «عدد نیست» است، یک مشکل محاسباتی را در موقعیت‌هایی علامت می‌زند که انتظار یک عدد می‌رفت. 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)
ویرایش از طریق GitHub این پیوند در پنجره یا زبانه‌ی جدیدی باز می‌شود

پوچی را یاد بگیرید