Подтвердить что ты не робот

Могут ли быть созданы списки, основанные на именах входных объектов?

Мне было бы очень полезно создать объект списка 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

Это было бы идеально. Любые предложения?

4b9b3361

Ответ 1

Кстати, я просто написал эту функцию. Он очень похож на решение @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)

Скопировано из комментариев: если вы хотите что-то из пакета CRAN, вы можете использовать Hmisc::llist:

Hmisc::llist(a, b, c, d=a, labels = FALSE)

Единственное очевидное отличие состоит в том, что отдельные векторы также имеют имена в этом случае.

Ответ 2

Случайная идея:

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

(Идея украдена из кода в data.frame.)

Ответ 3

Другая идея,

 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

Ответ 4

У tidyverse package 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