Ответ 1
Вы можете получить ту же структуру с помощью
mget(c("vowels", "consonants", "cars"))
но вам обязательно нужно указать имена переменных, которые не являются супер-сексуальными.
В интерактивном использовании мне иногда приходится связывать довольно большой набор
объекты вместе в списке. Чтобы получить список, в котором содержатся элементы
их первоначальные имена, я вынужден написать что-то вроде
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)
Вы можете получить ту же структуру с помощью
mget(c("vowels", "consonants", "cars"))
но вам обязательно нужно указать имена переменных, которые не являются супер-сексуальными.
Вот что я использовал совсем недавно.
Было бы неплохо, если бы было что-то более сжатое (или что-то встроенное в базу 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
Как насчет:
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"