Відповіді:
Технічно списки - це вектори, хоча дуже мало хто вживає цей термін. "список" - це один із декількох режимів, при цьому інші є "логічним", "символьним", "числовим", "цілим". Те, що ви називаєте векторами, - це "атомні вектори", строго кажучи:
aaa <- vector("list", 3)
is.list(aaa) #TRUE
is.vector(aaa) #TRUE
Списки "рекурсивного" типу (векторного), тоді як атомні вектори не є:
is.recursive(aaa) # TRUE
is.atomic(aaa) # FALSE
Ви обробляєте об'єкти даних з різними функціями залежно від того, є вони рекурсивними, атомними чи мають розмірні атрибути (матриці та масиви). Однак я не впевнений, що обговорення "переваг та недоліків" різних структур даних є достатньо зосередженим питанням для ПП. Щоб додати те, що сказав Томмі, окрім списків, здатних містити довільну кількість інших векторів, існує наявність фреймів даних, які є певним типом списку, який має розмірний атрибут, який визначає його структуру. На відміну від матриць та масивів, які є дійсно складеними атомними об'єктами, фрейми даних можуть містити різні типи, включаючи типи факторів.
Існує також застереження, що 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 / векторні одиниці.
На ці та подібні вступні запитання відповідають на 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
що означає список, що містить декілька типів даних, таких як числовий, символьний та логічний у моєму списку. Але у векторному буде єдиний тип даних усіх елементів у цьому векторі
для:
для вектора:
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
метод.