构建一个命名列表,而不必两次输入每个对象的名称

Jos*_*ien 17 r list

在交互式使用中,我偶尔需要将一组较大的对象捆绑在一个列表中.为了得到一个列表,其中元素保留其原始名称,我被迫写出类似的东西 list(Object1=Object1, Object2=Object2, ..... , Object25=Object25).

是否有一些直接的方法可以在列表中放置一组命名对象,这样他们就可以"保留"它们的名称,而无需nameXXX=nameXXX为每个命名对象输入?

cars <- mtcars[1:2,1:2]
vowels <- c("a","e","i","o","u")
consonants <- setdiff(letters, vowels)

## I'd like to get this result...
list(consonants=consonants, vowels=vowels, cars=cars)
## $consonants
##  [1] "b" "c" "d" "f" "g" "h" "j" "k" "l" "m" "n" "p" "q" "r" "s" "t" "v" "w" "x"
## [20] "y" "z"
##
## $vowels
## [1] "a" "e" "i" "o" "u"
##
## $cars
##               mpg cyl
## Mazda RX4      21   6
## Mazda RX4 Wag  21   6

## ... but by doing something more like
f(consonants, vowels, cars)
Run Code Online (Sandbox Code Playgroud)

MrF*_*ick 18

你可以得到相同的结构

mget(c("vowels", "consonants", "cars"))
Run Code Online (Sandbox Code Playgroud)

但你必须要引用不是超级性感的变量名称.

  • 这个修改允许不带引号的名称:`mget(sapply(表达式(元音,辅音,汽车),粘贴)) (4认同)
  • 有趣.我有点惊讶`粘贴'这样的作品.我本来期待一个`deparse`. (2认同)

Jos*_*ien 11

这是我最近使用的.

不过,如果有更简洁的东西(或基础R或一个体面的包装内置的东西)会很好,所以请随意添加其他/更好的答案.

LIST <- function(...) {
    nms <- sapply(as.list(substitute(list(...))), deparse)[-1]
    setNames(list(...), nms)
}

LIST(vowels, consonants, cars)
# $vowels
# [1] "a" "e" "i" "o" "u"
# 
# $consonants
#  [1] "b" "c" "d" "f" "g" "h" "j" "k" "l" "m" "n" "p" "q" "r" "s" "t" "v" "w" "x"
# [20] "y" "z"
# 
# $cars
#               mpg cyl
# Mazda RX4      21   6
# Mazda RX4 Wag  21   6
Run Code Online (Sandbox Code Playgroud)