是否可以创建基于输入对象名称命名的列表?

Fra*_*art 25 r list names

能够创建R列表对象而不必指定每个元素的名称对我非常有帮助.例如:

a1 <- 1
a2 <- 20
a3 <- 1:20

b <- list(a1,a2,a3, inherit.name=TRUE)
> b

[[a1]]
[1] 1

[[a2]]
[1] 20

[[a3]]
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20
Run Code Online (Sandbox Code Playgroud)

这将是理想的.有什么建议?

Ben*_*ker 22

巧合的是,我刚刚写了这个函数.它看起来很像@joran的解决方案,但它试图不踩已经命名的参数.

namedList <- function(...) {
    L <- list(...)
    snm <- sapply(substitute(list(...)),deparse)[-1]
    if (is.null(nm <- names(L))) nm <- snm
    if (any(nonames <- nm=="")) nm[nonames] <- snm[nonames]
    setNames(L,nm)
}
## TESTING:
a <- b <- c <- 1
namedList(a,b,c)
namedList(a,b,d=c)
namedList(e=a,f=b,d=c)
Run Code Online (Sandbox Code Playgroud)

复制评论:如果你想要一个CRAN包的东西,你可以使用Hmisc::llist:

Hmisc::llist(a, b, c, d=a, labels = FALSE)
Run Code Online (Sandbox Code Playgroud)

唯一明显的区别是在这种情况下,各个向量也有名称.

  • 还有Hmisc :: llist,例如llist(a1,a2,labels = FALSE).这可以防止已经命名的参数, (4认同)
  • 如果输入参数长于~60个字符,这将失败,因为在这种情况下`deparse()`将生成长度> 1的向量,而`sapply()`将生成列表而不是字符向量. (2认同)

MrF*_*ick 12

tidyverse软件包tibble具有可以执行此操作的功能.试用tibble::lst

tibble::lst(a1, a2, a3)
# $a1
#  [1] 1
#
# $a2
#  [1] 20
# 
# $a3
#  [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20
Run Code Online (Sandbox Code Playgroud)


jor*_*ran 11

一个随意的想法:

a1<-1
a2<-20
a3<-1:20

my_list <- function(...){
    names <- as.list(substitute(list(...)))[-1L]
    result <- list(...)
    names(result) <- names
    result
}

> my_list(a1,a2,a3)
$a1
[1] 1

$a2
[1] 20

$a3
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20
Run Code Online (Sandbox Code Playgroud)

(这个想法是从代码中偷来的data.frame.)

  • +1 - 这似乎也有效:`my_list < - function(...)setNames(list(...),substitute(alist(...)))` (3认同)

ags*_*udy 5

另一个想法,

 sapply(ls(pattern='^a[0-9]'), get)
$a1
[1] 1

$a2
[1] 20

$a3
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20
Run Code Online (Sandbox Code Playgroud)

  • 或者更简单的`mget(c('a1','a2','a3'))`(`mget`,而不是`sapply(...,get)` (4认同)