2013-07-24 20 views
11

Ho cercato estesamente una soluzione per questo compito molto semplice e sebbene abbia una soluzione, sembra che ci debba essere un modo migliore. Il compito è quello di creare una lista da un insieme di variabili, utilizzando i nomi delle variabili come nomi per ogni elemento della lista, ad esempio:R elenco da variabili che utilizzano nomi variabili

a <- 2 
b <- 'foo' 
c <- 1:4 

mia soluzione attuale:

named.list <- function(...) { 
    l <- list(...) 
    names(l) <- sapply(substitute(list(...)), deparse)[-1] 
    l 
} 
named.list(a,b,c) 

produce:

$a 
[1] 2 

$b 
[1] "foo" 

$c 
[1] 1 2 3 4 
+1

+1 Per esempio riproducibile. Non penso che questo sia un modo particolarmente * cattivo * di farlo da solo. Ma puoi evitare la chiamata 'sapply'. –

risposta

14

un paio di modi che posso pensare includono mget (fare ipotesi circa l'ambiente gli oggetti si trovano in):

mget(c("a","b","c")) 
$a 
[1] 2 

$b 
[1] "foo" 

$c 
[1] 1 2 3 4 

O come una modifica alla funzione, si potrebbe usare, match.call come questo:

named.list <- function(...) { 
    l <- list(...) 
    names(l) <- as.character(match.call()[-1]) 
    l 
} 
named.list(a,b,c) 
$a 
[1] 2 

$b 
[1] "foo" 

$c 
[1] 1 2 3 4 

Oppure si può fare in una sola volta utilizzando setNames come questo:

named.list <- function(...) { 
    l <- setNames(list(...) , as.character(match.call()[-1])) 
    l 
} 

named.list(a,b,c) 
$a 
[1] 2 

$b 
[1] "foo" 

$c 
[1] 1 2 3 4 
+0

+1! Vorrei 'as.list (match.call()) [- 1]'. e 'expand.dots = TRUE' è impostato per default – agstudy

+0

@agstudy grazie e ho preso in considerazione il tuo suggerimento su' expand.dots'! –

+0

Ciò non ti consentirà di assegnare un nome alla chiamata, ad es. '' 'r named.list (a, b, c = 1: 4)' '' non nominerà c. È possibile impostare '' l <- list (...) '' 'quindi aggiungere i nomi da match.call a elementi senza nomi per mantenere i nomi per le variabili nominate nella chiamata. – Wart