В чем разница между NULL и символом (0) | целое число (0) и т. д.?
> identical(NULL, character(0))
[1] FALSE
> is.null(integer(0))
[1] FALSE
> str(character(0))
chr(0)
> str(NULL)
NULL
В целом кажется, что вы можете передавать NULL
в качестве параметров в функции, и что пустой вектор обычно возвращается как character(0)
, integer(0)
и т. Д.
Почему это так? Если подумать, есть ли тест на нулевое значение, а-ля is.integer0
?
3 ответа
В определении языка R n есть это на NULL
:
Есть специальный объект под названием NULL. Он используется всякий раз, когда необходимо указать или указать, что объект отсутствует. Его не следует путать с вектором или списком нулевой длины. Объект NULL не имеет типа и изменяемых свойств. В R есть только один объект NULL, на который ссылаются все экземпляры. Для проверки наличия NULL используйте is.null. Вы не можете устанавливать атрибуты на NULL.
Таким образом, по определению NULL
сильно отличается от векторов нулевой длины. Вектор нулевой длины очень не отсутствует. NULL
на самом деле является универсальным средством для чего-то, что отсутствует или не установлено, но не является отсутствием, что является задачей NA
. Есть исключение, паирлист нулевой длины, как упоминал @Owen. Определение языка гласит:
Паирлист нулевой длины равен NULL, как и следовало ожидать в Лиспе, но в отличие от списка нулевой длины.
Что выделяет исключение в этом случае.
Чтобы проверить вектор нулевой длины, используйте, например, что-то вроде if(length(foo) == 0L)
. И объедините это с проверкой класса (is.character(foo)
), если вам нужен конкретный тип вектора нулевой длины.
У других ребят есть правильные ответы, но я хочу добавить несколько любопытных фактов.
Во-первых, не совсем верно, что NULL "используется всякий раз, когда есть необходимость указать или указать, что объект отсутствует", как говорится в документе. Фактически в R есть 2 других значения «без данных» (не считая NA, которое не является полным значением).
Есть «пропущено», которое используется для пропущенных аргументов:
список (x =) $ x
> identical(NULL, alist(x=)$x)
[1] FALSE
> y = alist(x=)$x
> y
Error: argument "y" is missing, with no default
Затем есть «несвязанный», к которому вы не можете (AFAIK) получить доступ напрямую, но используя C:
SEXP getUnbound(void) {
return R_UnboundValue;
}
> x = .Call("getUnbound")
> x
Error: object 'x' not found
Вот частичный ответ, начинающийся с простой цитаты из Руководства по определению языка R:
Есть специальный объект под названием NULL. Он используется всякий раз, когда необходимо указать или указать, что объект отсутствует. Его не следует путать с вектором или списком нулевой длины. Объект NULL не имеет типа и изменяемых свойств. В R есть только один объект NULL, на который ссылаются все экземпляры. Для проверки наличия NULL используйте is.null. Вы не можете устанавливать атрибуты на NULL.
Я считаю, что это означает, что векторы нулевой длины могут иметь атрибуты, тогда как NULL
не может:
> x <- character(0)
> y <- NULL
> attr(x,"name") <- "nm"
> attr(y,"name") <- "nm"
Error in attr(y, "name") <- "nm" : attempt to set an attribute on NULL
Похожие вопросы
Связанные вопросы
Новые вопросы
r
R - это бесплатный язык программирования с открытым исходным кодом и программная среда для статистических вычислений, биоинформатики, визуализации и общих вычислений. Пожалуйста, предоставьте минимальные и воспроизводимые примеры вместе с желаемым результатом. Используйте dput () для данных и укажите все небазовые пакеты с вызовами library (). Не вставляйте изображения для данных или кода, вместо этого используйте блоки кода с отступом. По вопросам, связанным со статистикой, используйте https://stats.stackexchange.com.