2013-06-05 10 views

risposta

19

Casualmente, ho appena scritto questa funzione. Assomiglia molto alla soluzione di @joran, ma cerca di non calpestare argomenti già nominati.

namedList <- function(...) { 
    L <- list(...) 
    snm <- sapply(substitute(list(...)),deparse)[-1] 
    if (is.null(nm <- names(L))) nm <- snm 
    if (any(nonames <- nm=="")) nm[nonames] <- snm[nonames] 
    setNames(L,nm) 
} 
## TESTING: 
a <- b <- c <- 1 
namedList(a,b,c) 
namedList(a,b,d=c) 
namedList(e=a,f=b,d=c) 

Copiato da commenti: se volete qualcosa da un pacchetto CRAN, è possibile utilizzare Hmisc::llist:

Hmisc::llist(a, b, c, d=a, labels = FALSE) 

L'unica differenza evidente è che i singoli vettori hanno anche nomi in questo caso.

+4

C'è anche Hmisc :: llist eg llist (a1, a2, labels = FALSE) .Questo protegge dagli argomenti già nominati, – mnel

+0

Grazie mille! Mi piace molto questo. Lo implementerò in un [ pacchetto] (https://github.com/EconometricsBySimulation/RConcerto/blob/master/Package.R) Sto lavorando su – fsmart

+1

Questo fallirà se gli argomenti di input sono più lunghi di ~ 60 caratteri perché in questo caso 'deparse()' genererà un vettore di lunghezza> 1, e 'sapply()' creerà una lista invece di un vettore di caratteri. – hadley

11

Un'idea casuale:

a1<-1 
a2<-20 
a3<-1:20 

my_list <- function(...){ 
    names <- as.list(substitute(list(...)))[-1L] 
    result <- list(...) 
    names(result) <- names 
    result 
} 

> my_list(a1,a2,a3) 
$a1 
[1] 1 

$a2 
[1] 20 

$a3 
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 

(. L'idea è stato rubato dal codice in data.frame)

+3

+1 - Anche questo sembra funzionare: 'my_list <- function (...) setNames (list (...), sostituto (alist (...)))' – flodel

+0

C'è anche 'Hmisc :: llist' eg 'llist (a1, a2, labels = FALSE)' – mnel

4

Un'altra idea,

sapply(ls(pattern='^a[0-9]'), get) 
$a1 
[1] 1 

$a2 
[1] 20 

$a3 
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 
+3

O più semplicemente 'mget (c ('a1', 'a2', 'a3'))' ('mget', non' sapply (... , get) ' – mnel

Problemi correlati