R и двойные скобки для вложенных списков - PullRequest
0 голосов
/ 16 февраля 2019

Есть много сообщений об индексировании списков, но я до сих пор не могу разобраться с методами индексации именованных и безымянных вложенных списков.Вот мой пример

person <- list("name"="John","age"=19,"speaks"=c("English","French")) 
Johns_brother <- list("name"="Sam","age"=20,"speaks"=c("English","Spanish"))
Johns_sister <- list("name"="Minerva","age"=17,"speaks"=c("English","Italian"))
Johns_sister <- list("name"="Minerva","age"=17,"speaks"=c("English","Italian"))
Johns_other_sister <- list("name"="Casandra","age"=23,"speaks"=c("English","Greek"))
person <- list("name"="John","age"=19,"speaks"=c("English","French"),"siblings"=list(Johns_brother,Johns_sister,Johns_other_sister))

Оба эти метода индексации возвращают списки

class(person$siblings[1])
class(person$siblings[[1]])

Но только второй позволяет мне выбирать именованные элементы

person$siblings[1]$name
person$siblings[[1]]$name

Теперь ямы видели посты, которые настаивают (все заглавные буквы в оригинале) «ДВОЙНОЙ КРОНШТЕЙН НИКОГДА НЕ ВОЗВРАЩАЕТ СПИСОК. ДОВОЛЬНО ДВОЙНОЙ КРОНШТЕЙН ВОЗВРАЩАЕТСЯ ТОЛЬКО ОДНОМ ЭЛЕМЕНТЕ ИЗ СПИСКА» Но это, очевидно, неверно, поскольку оба метода индексации возвращают списки.Но две формы скобок возвращают РАЗНЫЕ списки, верно?Какова основная логика здесь?

1 Ответ

0 голосов
/ 16 февраля 2019

Подумай об этом.Запись [[ индексирует элемент списка.Но что, если этот элемент сам по себе является списком?

list(a = list(b = 1))[[1]]
# $b
# [1] 1

В приведенном выше примере возвращаемое значение по-прежнему является списком, поскольку a является списком.Возвращаемое значение зависит от индексируемого значения. Справка по этому вопросу может быть найдена в help(Extract) -

Индексирование [ аналогичен атомным векторам, а выбирает список указанного элемента (ов).

Оба [[ и $ выбирают один элемент списка.

Также помогает узнать разницу между атомарным и рекурсивным (похожим на список) векторами.

...