2013-07-24 77 views
11

我已经广泛地寻找了解决这个非常简单的任务,尽管我有一个解决方案,但似乎必须有更好的方法。任务是从一组变量创建列表,使用变量名作为名称列表中的每个元素,如:使用变量名称变量的R列表

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

我目前的解决方案:

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

产地:

$a 
[1] 2 

$b 
[1] "foo" 

$c 
[1] 1 2 3 4 
+1

+1以可重现的例子。我不认为这是我自己做的特别糟糕的方式。但是你可以避免'sapply'的调用。 –

回答

14

我能想到的几种方法包括mget(对物体所处的环境进行假设):

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

$b 
[1] "foo" 

$c 
[1] 1 2 3 4 

或者作为编辑你的功能,你可以使用,match.call这样的:

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 

,也可以使用setNames这样做一气呵成:

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!我会'as.list(match.call())[ - 1]'。 'expand.dots = TRUE'默认设置为 – agstudy

+0

@agstudy谢谢,我注意到了'expand.dots'的提示! –

+0

这不允许您在通话中指定某些内容,例如'''r named.list(a,b,c = 1:4)'''不会命名c。您可以设置''l < - list(...)'''然后将名称从match.call添加到没有名称的元素,以便为调用中指定的变量保留名称。 – Wart