В чем разница между 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?

47
Andrie 25 Авг 2011 в 22:17

3 ответа

Лучший ответ

В определении языка R n есть это на NULL :

Есть специальный объект под названием NULL. Он используется всякий раз, когда необходимо указать или указать, что объект отсутствует. Его не следует путать с вектором или списком нулевой длины. Объект NULL не имеет типа и изменяемых свойств. В R есть только один объект NULL, на который ссылаются все экземпляры. Для проверки наличия NULL используйте is.null. Вы не можете устанавливать атрибуты на NULL.

Таким образом, по определению NULL сильно отличается от векторов нулевой длины. Вектор нулевой длины очень не отсутствует. NULL на самом деле является универсальным средством для чего-то, что отсутствует или не установлено, но не является отсутствием, что является задачей NA. Есть исключение, паирлист нулевой длины, как упоминал @Owen. Определение языка гласит:

Паирлист нулевой длины равен NULL, как и следовало ожидать в Лиспе, но в отличие от списка нулевой длины.

Что выделяет исключение в этом случае.

Чтобы проверить вектор нулевой длины, используйте, например, что-то вроде if(length(foo) == 0L). И объедините это с проверкой класса (is.character(foo)), если вам нужен конкретный тип вектора нулевой длины.

39
Gavin Simpson 25 Авг 2011 в 18:53

У других ребят есть правильные ответы, но я хочу добавить несколько любопытных фактов.

Во-первых, не совсем верно, что 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
11
Owen 25 Авг 2011 в 19:05

Вот частичный ответ, начинающийся с простой цитаты из Руководства по определению языка 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
10
joran 25 Авг 2011 в 18:25