5.3 NULL
NULL
是个特殊值,它表示一个空的变量。它最常用于列表中,不过也会出现在数据框和函数参数中,这些将在后文中讨论。
在创建列表时,你可能会想指定一个元素,表明它必须存在但没有赋值。例如,下表按月份列出了英国在2013年的银行假期1。有几个月没有公假日,我们用NULL
表示:
1 银行假期指公众假期。
(uk_bank_holidays_2013 <- list(
Jan = "New Year's Day",
Feb = NULL,
Mar = "Good Friday",
Apr = "Easter Monday",
May = c("Early May Bank Holiday", "Spring Bank Holiday"),
Jun = NULL,
Jul = NULL,
Aug = "Summer Bank Holiday",
Sep = NULL,
Oct = NULL,
Nov = NULL,
Dec = c("Christmas Day", "Boxing Day")
))
## $Jan
## [1] "New Year's Day"
##
## $Feb
## NULL
##
## $Mar
## [1] "Good Friday"
##
## $Apr
## [1] "Easter Monday"
##
## $May
## [1] "Early May Bank Holiday" "Spring Bank Holiday"
##
## $Jun
## NULL
##
## $Jul
## NULL
##
## $Aug
## [1] "Summer Bank Holiday"
##
## $Sep
## NULL
##
## $Oct
## NULL
##
## $Nov
## NULL
##
## $Dec
## [1] "Christmas Day" "Boxing Day"
理解NULL
和特殊的缺失值NA
之间的区别非常重要。最大的区别是,NA
是标量值,而NULL
不会占用任何空间——它的长度为零:
length(NULL)
## [1] 0
length(NA)
## [1] 1
你可以使用函数is.null
测试变量是否为NULL
值。缺失值不是NULL
:
is.null(NULL)
## [1] TRUE
is.null(NA)
## [1] FALSE
反过来的测试没有太大的意义。因为NULL
的长度为零,我们无法测试它是否是缺失的:
is.na(NULL)
## Warning: is.na() applied to non-(list or vector) of type 'NULL'
## logical(0)
NULL
也可用于删除列表中的元素。把元素设置为NULL
(即使它已经是NULL
)则会删除它。假设由于某种原因,我们要切换到一个老式的罗马十月式日历,它没有一月和二月:
uk_bank_holidays_2013$Jan <- NULL
uk_bank_holidays_2013$Feb <- NULL
uk_bank_holidays_2013
## $Mar
## [1] "Good Friday"
##
## $Apr
## [1] "Easter Monday"
##
## $May
## [1] "Early May Bank Holiday" "Spring Bank Holiday"
##
## $Jun
## NULL
##
## $Jul
## NULL
##
## $Aug
## [1] "Summer Bank Holiday"
##
## $Sep
## NULL
##
## $Oct
## NULL
##
## $Nov
## NULL
##
## $Dec
## [1] "Christmas Day" "Boxing Day"
要将现有元素设置为NULL
值,我们不能简单地为其分配NULL
,因为这将删除元素。而是,它必须使用list(NULL)
来设置。现在,假设英国政府取消了夏季银行假期:
uk_bank_holidays_2013["Aug"] <- list(NULL)
uk_bank_holidays_2013
## $Mar
## [1] "Good Friday"
##
## $Apr
## [1] "Easter Monday"
##
## $May
## [1] "Early May Bank Holiday" "Spring Bank Holiday"
##
## $Jun
## NULL
##
## $Jul
## NULL
##
## $Aug
## NULL
##
## $Sep
## NULL
##
## $Oct
## NULL
##
## $Nov
## NULL
##
## $Dec
## [1] "Christmas Day" "Boxing Day"