Правильный способ выбора нескольких элементов списка по имени

#r #list

#r #Список

Вопрос:

Каков правильный способ вернуть новый список с некоторыми, но не со всеми элементами списка, на которые ссылаются по имени? Например:

 $`listA`
[1] 1 2 3 4 5

$listB
[1] "a" "b" "c" "d" "e"

$listC
[1] 25 26 27 28 29 30
  

должно стать:

 $`listA`
[1] 1 2 3 4 5

$listC
[1] 25 26 27 28 29 30
  

Вот некоторые данные:

 list1 <- 1:10
list2 <- letters[1:26]
list3 <- 25:32
mylist <- list(list1,list2,list3)
names(mylist) <- c("listA", "listB", "listC")
  

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

1. mylist[c("listA", "listC")]

2. И если вы хотите удалить некоторые из них, сделайте: mylist[c("listA","listB")] = NULL

Ответ №1:

Самый простой способ — использовать [ оператор, подобный:

 mylist[c("listA", "listC")]
  

Вывод:

 $`listA`
 [1]  1  2  3  4  5  6  7  8  9 10

$listC
[1] 25 26 27 28 29 30 31 32
  

Обратите внимание, что при выборе одного элемента из списка с помощью [ результат может быть не таким, как мы ожидаем:

 mylist["listA"]
  

Вывод:

 $`listA`
 [1]  1  2  3  4  5  6  7  8  9 10

> class(mylist["listA"])
[1] "list"
  

Здесь мы видим, что выбор элемента "listA" с помощью [ не возвращает сам элемент, а вместо этого возвращает список, содержащий "listA" элемент. Если мы хотим подмножество самого элемента по имени, мы должны использовать [[ оператор:

 mylist[["listA"]]
  

Вывод:

 [1]  1  2  3  4  5  6  7  8  9 10

> class(mylist[["listA"]])
[1] "integer"
  

Другое различие между [ и [[ заключается в том, [[ что их можно использовать только для выбора одного элемента. Например, следующее не будет работать:

 mylist[[c("listA", "listC")]]
  

Ошибка в mylist[[c(«listA», «listC»)]]: нижний индекс выходит за пределы