这个问题在这里已有答案:
- 是否可以创建基于输入对象名称命名的列表? 4个答案
11371
2017-07-24 10:11
起源
+1对于可重复的示例。我不认为这是特别的 坏 自己做的方式。但你可以避免 sapply 呼叫。 - Simon O'Hanlon
答案:
我能想到的几种方式包括 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
14
2017-07-24 10:19
+1!我会 as.list(match.call())[-1]。和 expand.dots = TRUE 默认设置 - agstudy
@ agstudy谢谢,我注意到了你的提示 expand.dots! - Simon O'Hanlon
这不允许您在通话中命名,例如 r named.list(a, b, c = 1:4) 不会命名c。你可以设置 l <- list(...) 然后将match.call中的名称添加到没有名称的元素中,以保留调用中命名的变量的名称。 - Wart
如果你已经使用了tidyverse软件包,那么你可能会对使用它感兴趣 tibble::lst
这样做的功能
tibble::lst(a, b, c)
# $a
# [1] 2
#
# $b
# [1] "foo"
#
# $c
# [1] 1 2 3 4
1
2018-03-13 15:46