Почему is.vector() возвращает TRUE для списка?

#r

#r

Вопрос:

Я новичок в R. Просматривая документацию R, я наткнулся на это предложение ?is.vector : «Если mode = «any», is.vector может возвращать TRUE для атомарных режимов, списка и выражения».

Мне просто любопытно — почему? Во всей документации, которую я прочитал, говорится, что списки и векторы — это два разных типа данных. Есть ли какая-то более глубокая концепция типа данных R, которую я не понимаю?

Ответ №1:

Список (в большинстве случаев) сам по себе является вектором. Из файлов справки для ?list : «Большинство списков в R внутренне являются универсальными векторами, тогда как традиционные парные списки с точками (как в LISP) доступны, но редко просматриваются пользователями (за исключением формальных функций)». ,,,,,,,,,,,».,,,,,,,,,,,

Это означает, что вы можете использовать vector для предварительного выделения памяти для списка:

 x <- vector("list", 3)
class(x)
[1] "list"
  

Теперь присвоите значение второму элементу в списке:

 x[[2]] <- 1:5

x

[[1]]
NULL

[[2]]
[1] 1 2 3 4 5

[[3]]
NULL
  

Смотрите ?list и ?vector для получения более подробной информации.

Комментарии:

1. Это объясняет, почему функция возвращает, почему она это делает. Это не объясняет, почему язык такой, каким он есть. У кого-нибудь есть идеи по этому поводу?

Ответ №2:

Смотрите раздел «R Внутренние структуры» (в частности, раздел 1.1.1) руководства по R внутренним устройствам. Список (в том смысле, о котором вы говорите) — это VECSXP , тип вектора.

Комментарии:

1. @Quant Guy: Вам не нужно изучать внутренности, чтобы использовать R, но это полезно, если вы хотите «заглянуть под капот».