Ответы:
Технически списки являются векторами, хотя очень немногие используют этот термин. «список» - это один из нескольких режимов, другие - «логический», «символьный», «числовой», «целочисленный». То, что вы называете векторами, является «атомарными векторами» в строгом выражении R:
aaa <- vector("list", 3)
is.list(aaa) #TRUE
is.vector(aaa) #TRUE
Списки являются «рекурсивным» типом (векторов), тогда как атомарные векторы - нет:
is.recursive(aaa) # TRUE
is.atomic(aaa) # FALSE
Вы обрабатываете объекты данных с различными функциями в зависимости от того, являются ли они рекурсивными, атомарными или имеют размерные атрибуты (матрицы и массивы). Однако я не уверен, что обсуждение «преимуществ и недостатков» различных структур данных является достаточно сфокусированным вопросом для SO. Чтобы добавить к тому, что сказал Томми, помимо списков, способных содержать произвольное количество других векторов, есть доступность фреймов данных, которые представляют собой особый тип списка, который имеет размерный атрибут, который определяет его структуру. В отличие от матриц и массивов, которые на самом деле представляют собой свернутые атомарные объекты, фреймы данных могут содержать различные типы, включая типы факторов.
Также есть предостережение, что is.vector
функция будет возвращать, FALSE
когда есть атрибуты, отличные от имен. Смотрите: что такое вектор?
Списки «рекурсивны». Это означает, что они могут содержать значения разных типов, даже другие списки:
x <- list(values=sin(1:3), ids=letters[1:3], sub=list(foo=42,bar=13))
x # print the list
x$values # Get one element
x[["ids"]] # Another way to get an element
x$sub$foo # Get sub elements
x[[c(3,2)]] # Another way (gets 13)
str(x) # A "summary" of the list's content
Списки используются в R для представления наборов данных: data.frame
класс, по сути, представляет собой список, в котором каждый элемент является столбцом определенного типа.
Другое использование - при представлении модели: результат lm
возвращает список, содержащий множество полезных объектов.
d <- data.frame(a=11:13, b=21:23)
is.list(d) # TRUE
str(d)
m <- lm(a ~ b, data=d)
is.list(m) # TRUE
str(m)
Атомарные векторы (не списковые, а числовые, логические и символьные) полезны, поскольку известно, что все элементы имеют один и тот же тип. Это позволяет очень быстро управлять ими.
Как человек, который только что освоил R, но имеет опыт работы с C / Java / Ruby / PHP / Python, вот что я думаю об этом.
A list
действительно массив + хэш-карта. Это ассоциативный массив PHP.
> foo = list(bar='baz')
> foo[1]
'baz'
> foo$bar
'baz'
> foo[['bar']]
'baz'
A vector
- это массив / список фиксированного типа. Думайте об этом как о связанном списке, потому что размещение разнородных элементов в связанном списке в любом случае является анти-шаблоном. Это вектор в том же смысле, в котором это слово используется в модулях SIMD / MMX / vector.
Ответы на этот и аналогичные вводные вопросы можно найти на http://www.burns-stat.com/pages/Tutor/hints_R_begin.html.
Это должно быть мягкое введение, которое поможет вам как можно быстрее приступить к работе с R. В какой-то степени это удается.
--- Редактировать: --
Попытка объяснить дальше; цитируется из приведенной выше ссылки.
Атомный вектор
Вероятно, вы встретите три разновидности атомарного вектора:
- «Числовой»
- «Логическое»
- "персонаж"
Об атомарных векторах следует помнить, что все элементы в них относятся только к одному типу.
Список
Списки могут содержать разные типы элементов в разных компонентах. Компонент списка может быть другим списком, атомарным вектором (и другими вещами).
Также перейдите по этой ссылке.
список включает несколько типов данных, таких как символьные, числовые, логические и т. д. но вектор содержит только данные аналогичного типа. например:
scores <- c(20,30,40,50)
student <- c("A","B","C","D")
sc_log <- c(TRUE,FALSE,FALSE,TRUE)
для списка:
mylist <- list(scores,student,sc_log)
# search for class of mylist vector
#check structure of mylist using str() function.
str(mylist)
[1] list of 3
[1] $:num [1:4] 20 30 40 50
[2] $:chr [1:4] "A""B""C""D"
[3] $:log [1:4] TRUE FALSE FALSE TRUE
что означает список, содержащий несколько типов данных, таких как числовой, символьный и логический в mylist, но в векторе будет один тип данных для всех элементов в этом векторе
например:
для вектора:
vector1 <- c(1,2,3,4)
Class(vector1)
[1] "Numeric"
#which means all elements of vector containing single data type that is numeric only.
key
s в векторах, используяnames
метод.