Дублировать имена списков в R

Что здесь происходит, когда в R есть повторяющиеся имена списков?

l <- list()
l[["A"]] <- 5
l[["B"]] <- 7
l[["C"]] <- 9
names(l) <- c("B", "B", "C")

Печать l[["B"]] возвращает

$B
[1] 5

Печать l возвращает

$B
[1] 5

$B
[1] 7

$C
[1] 9

Существует ли стандартный способ получения всех значений для ключа "B", когда "B" дублируется?

Ответ 1

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

l["B"]
# $B
# [1] 5

Мы также видим, что попытка c("B", "B"), поскольку подмножество даже не дает нам правильного результата, потому что R возвращается и снова получает первый B.

l[c("B", "B")]
# $B
# [1] 5
#
# $B
# [1] 5

Одним из самых безопасных способов извлечения всех элементов B является использование логического подмножества вектора names(). Это даст нам правильные элементы.

l[names(l) == "B"]
# $B
# [1] 5
#
# $B
# [1] 7

Это отличный пример того, почему следует избегать дублирования имен.