Багато мов мають спосіб позначити неіснуюче значення, наприклад 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 remove), щоб зробити це явним:
v <- c(1, 2, NA, 4, 5)
mean(v)
#> [1] NA
mean(v, na.rm = TRUE)
#> [1] 3
Скорочення від «Not a Number»: 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
Ми також можемо створити вектор, а потім прибрати з нього всі елементи, як описано в концепції векторів. У результаті отримуємо вектор довжини 0 відповідного типу.
v <- 5
v[-1] # delete the first element
#> numeric(0)