Подтвердить что ты не робот

В чем разница между NULL и символом (0) в R?

В чем разница между NULL и символом (0) | integer (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) и т.д.

Почему это так? Подумайте об этом, есть ли тест на нуль, a la is.integer0?

4b9b3361

Ответ 1

R Language Definitio n имеет значение NULL:

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

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

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

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

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

Ответ 2

Здесь частичный ответ, начиная с простого цитирования руководства по определению языка 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

Ответ 3

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

Во-первых, не совсем верно, что NULL "используется всякий раз, когда требуется указать или указать, что объект отсутствует", как говорится в документе. Фактически в R есть 2 других значения "без данных" (не считая NA, которое не является полным значением).

Там "отсутствует", который используется для отсутствующих аргументов:

ALIST (х = х) $

> identical(NULL, alist(x=)$x)
[1] FALSE
> y = alist(x=)$x
> y
Error: argument "y" is missing, with no default

Затем там "unbound", который вы не можете (AFAIK) получить напрямую, но используя C:

SEXP getUnbound(void) {
    return R_UnboundValue;
}

> x = .Call("getUnbound")
> x
Error: object 'x' not found