我已经广泛寻找这个非常简单的任务的解决方案,虽然我有一个解决方案,但似乎必须有更好的方法。任务是从一组变量创建一个列表,使用变量名作为列表中每个元素的名称,例如:
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
答案 0 :(得分:15)
我能想到的几种方法包括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
答案 1 :(得分:1)
如果您已经使用了tidyverse软件包,那么您可能有兴趣使用执行此操作的tibble::lst
函数
tibble::lst(a, b, c)
# $a
# [1] 2
#
# $b
# [1] "foo"
#
# $c
# [1] 1 2 3 4