16

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

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
4

2 回答 2

17

我能想到的几种方法包括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
于 2013-07-24T10:19:21.420 回答
6

如果您已经在使用 tidyverse 包,那么您可能有兴趣使用 tibble::lst执行此操作的函数

tibble::lst(a, b, c)
# $a
#  [1] 2
#  
# $b
# [1] "foo"
# 
# $c
# [1] 1 2 3 4
于 2018-03-13T15:46:56.160 回答