Построение именованного списка без необходимости вводить имя каждого объекта дважды

В интерактивном использовании мне иногда приходится связывать довольно большой набор объекты вместе в списке. Чтобы получить список, в котором содержатся элементы их первоначальные имена, я вынужден написать что-то вроде list(Object1=Object1, Object2=Object2, ..... , Object25=Object25).

Есть ли простой способ разместить набор именованных объектов в списке, чтобы они "сохраняли" свои имена, не набирая nameXXX=nameXXX для каждого из них?

cars <- mtcars[1:2,1:2]
vowels <- c("a","e","i","o","u")
consonants <- setdiff(letters, vowels)

## I'd like to get this result...
list(consonants=consonants, vowels=vowels, cars=cars)
## $consonants
##  [1] "b" "c" "d" "f" "g" "h" "j" "k" "l" "m" "n" "p" "q" "r" "s" "t" "v" "w" "x"
## [20] "y" "z"
##
## $vowels
## [1] "a" "e" "i" "o" "u"
##
## $cars
##               mpg cyl
## Mazda RX4      21   6
## Mazda RX4 Wag  21   6

## ... but by doing something more like
f(consonants, vowels, cars)

Ответы

Ответ 1

Вы можете получить ту же структуру с помощью

mget(c("vowels", "consonants", "cars"))

но вам обязательно нужно указать имена переменных, которые не являются супер-сексуальными.

Ответ 2

Вот что я использовал совсем недавно.

Было бы неплохо, если бы было что-то более сжатое (или что-то встроенное в базу R или достойный пакет), поэтому, пожалуйста, не стесняйтесь добавлять другие/лучшие ответы.

LIST <- function(...) {
    nms <- sapply(as.list(substitute(list(...))), deparse)[-1]
    setNames(list(...), nms)
}

LIST(vowels, consonants, cars)
# $vowels
# [1] "a" "e" "i" "o" "u"
# 
# $consonants
#  [1] "b" "c" "d" "f" "g" "h" "j" "k" "l" "m" "n" "p" "q" "r" "s" "t" "v" "w" "x"
# [20] "y" "z"
# 
# $cars
#               mpg cyl
# Mazda RX4      21   6
# Mazda RX4 Wag  21   6

Ответ 3

Как насчет:

namedList  <-  function(...){
    out  <-  list(...)
    for(i in seq(length(out)))
        names(out)[i]  <-  as.character(sys.call()[[i+1]])
    out
}

foo = 1
bar = 'Hello world'
namedList(foo,bar)

#> $foo
#> [1] 1
#> 
#> $bar
#> [1] "Hello world"