2015-06-10 2 views
16

Bei der interaktiven Verwendung muss ich gelegentlich einen größeren Satz von Objekten in einer Liste zusammenfassen. Um eine Liste zu erhalten, in der die Elemente ihren ursprünglichen Namen behalten, bin ich gezwungen, etwas wie list(Object1=Object1, Object2=Object2, ..... , Object25=Object25) zu schreiben.Konstruieren einer benannten Liste, ohne den Namen jedes Objekts zweimal eingeben zu müssen

Gibt es eine einfache Möglichkeit, eine Gruppe von benannten Objekten in einer Liste zu platzieren, so dass sie ihre Namen behalten, ohne nameXXX=nameXXX für jede eingeben zu müssen?

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) 
+0

Danke, @BenBolker - ich Ihre Antwort akzeptieren würde, wenn ich könnte. –

Antwort

10

Hier ist, was ich zuletzt verwendet habe.

Es wäre aber schön, wenn es etwas prägnanteres (oder etwas in base R oder ein anständiges Paket eingebautes) gäbe, also bitte fügen Sie andere/bessere Antworten hinzu.

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 
18

Sie können die gleiche Struktur erhalten mit

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

aber Sie müssen die Variablennamen zu zitieren haben, die nicht super sexy ist.

+4

Diese Modifikation erlaubt nicht abgekürzte Namen: 'mget (sapply (Ausdruck (Vokale, Konsonanten, Autos), Paste)' –

+2

Interessant. Ich bin irgendwie überrascht, dass "Paste" so funktioniert. Ich hätte ein "deparse" erwartet. – MrFlick

1

Wie wäre:

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" 
Verwandte Themen