2013-07-24 83 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