5.3 NULL

NULL是个特殊值,它表示一个空的变量。它最常用于列表中,不过也会出现在数据框和函数参数中,这些将在后文中讨论。

在创建列表时,你可能会想指定一个元素,表明它必须存在但没有赋值。例如,下表按月份列出了英国在2013年的银行假期1。有几个月没有公假日,我们用NULL表示:

1 银行假期指公众假期。

  1. (uk_bank_holidays_2013 <- list(
  2. Jan = "New Year's Day",
  3. Feb = NULL,
  4. Mar = "Good Friday",
  5. Apr = "Easter Monday",
  6. May = c("Early May Bank Holiday", "Spring Bank Holiday"),
  7. Jun = NULL,
  8. Jul = NULL,
  9. Aug = "Summer Bank Holiday",
  10. Sep = NULL,
  11. Oct = NULL,
  12. Nov = NULL,
  13. Dec = c("Christmas Day", "Boxing Day")
  14. ))
  15. ## $Jan
  16. ## [1] "New Year's Day"
  17. ##
  18. ## $Feb
  19. ## NULL
  20. ##
  21. ## $Mar
  22. ## [1] "Good Friday"
  23. ##
  24. ## $Apr
  25. ## [1] "Easter Monday"
  26. ##
  27. ## $May
  28. ## [1] "Early May Bank Holiday" "Spring Bank Holiday"
  29. ##
  30. ## $Jun
  31. ## NULL
  32. ##
  33. ## $Jul
  34. ## NULL
  35. ##
  36. ## $Aug
  37. ## [1] "Summer Bank Holiday"
  38. ##
  39. ## $Sep
  40. ## NULL
  41. ##
  42. ## $Oct
  43. ## NULL
  44. ##
  45. ## $Nov
  46. ## NULL
  47. ##
  48. ## $Dec
  49. ## [1] "Christmas Day" "Boxing Day"

理解NULL和特殊的缺失值NA之间的区别非常重要。最大的区别是,NA是标量值,而NULL不会占用任何空间——它的长度为零:

  1. length(NULL)
  2. ## [1] 0
  3. length(NA)
  4. ## [1] 1

你可以使用函数is.null测试变量是否为NULL值。缺失值不是NULL

  1. is.null(NULL)
  2. ## [1] TRUE
  3. is.null(NA)
  4. ## [1] FALSE

反过来的测试没有太大的意义。因为NULL的长度为零,我们无法测试它是否是缺失的:

  1. is.na(NULL)
  2. ## Warning: is.na() applied to non-(list or vector) of type 'NULL'
  3. ## logical(0)

NULL也可用于删除列表中的元素。把元素设置为NULL(即使它已经是NULL)则会删除它。假设由于某种原因,我们要切换到一个老式的罗马十月式日历,它没有一月和二月:

  1. uk_bank_holidays_2013$Jan <- NULL
  2. uk_bank_holidays_2013$Feb <- NULL
  3. uk_bank_holidays_2013
  4. ## $Mar
  5. ## [1] "Good Friday"
  6. ##
  7. ## $Apr
  8. ## [1] "Easter Monday"
  9. ##
  10. ## $May
  11. ## [1] "Early May Bank Holiday" "Spring Bank Holiday"
  12. ##
  13. ## $Jun
  14. ## NULL
  15. ##
  16. ## $Jul
  17. ## NULL
  18. ##
  19. ## $Aug
  20. ## [1] "Summer Bank Holiday"
  21. ##
  22. ## $Sep
  23. ## NULL
  24. ##
  25. ## $Oct
  26. ## NULL
  27. ##
  28. ## $Nov
  29. ## NULL
  30. ##
  31. ## $Dec
  32. ## [1] "Christmas Day" "Boxing Day"

要将现有元素设置为NULL值,我们不能简单地为其分配NULL,因为这将删除元素。而是,它必须使用list(NULL)来设置。现在,假设英国政府取消了夏季银行假期:

  1. uk_bank_holidays_2013["Aug"] <- list(NULL)
  2. uk_bank_holidays_2013
  3. ## $Mar
  4. ## [1] "Good Friday"
  5. ##
  6. ## $Apr
  7. ## [1] "Easter Monday"
  8. ##
  9. ## $May
  10. ## [1] "Early May Bank Holiday" "Spring Bank Holiday"
  11. ##
  12. ## $Jun
  13. ## NULL
  14. ##
  15. ## $Jul
  16. ## NULL
  17. ##
  18. ## $Aug
  19. ## NULL
  20. ##
  21. ## $Sep
  22. ## NULL
  23. ##
  24. ## $Oct
  25. ## NULL
  26. ##
  27. ## $Nov
  28. ## NULL
  29. ##
  30. ## $Dec
  31. ## [1] "Christmas Day" "Boxing Day"