2013-06-05 22 views
19

Nó sẽ rất hữu ích cho tôi để có thể tạo ra một đối tượng danh sách R mà không cần phải xác định tên của mỗi phần tử. Ví dụ:Danh sách có thể được tạo ra mà tự đặt tên dựa trên tên đối tượng đầu vào không?

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 

Điều này lý tưởng. Bất kỳ đề xuất?

Trả lời

19

Thật trùng hợp, tôi chỉ viết chức năng này. Nó trông rất giống với giải pháp @ joran, nhưng nó cố gắng không dẫm lên các đối số đã được đặt tên.

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) 

sao chép từ nhận xét: nếu bạn muốn một cái gì đó từ một gói Cran, bạn có thể sử dụng Hmisc::llist:

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

duy nhất khác biệt rõ ràng là các vectơ cá nhân cũng có tên trong trường hợp này.

+4

Cũng có cả HMisc :: llist, ví dụ: llist (a1, a2, labels = FALSE) .Điều này bảo vệ chống lại các đối số đã được đặt tên, – mnel

+0

Cảm ơn rất nhiều! Tôi thực sự thích cái này. Tôi sẽ thực hiện nó trong một [ package] (https://github.com/EconometricsBySimulation/RConcerto/blob/master/Package.R) Tôi đang làm việc trên – fsmart

+1

Điều này sẽ thất bại nếu các đối số đầu vào dài hơn ~ 60 ký tự vì trong trường hợp đó 'deparse()' sẽ tạo ra một vectơ có độ dài> 1, và 'sapply()' sẽ tạo một danh sách thay vì một vectơ ký tự. – hadley

11

Một ý tưởng ngẫu nhiên:

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 

(. Ý tưởng bị đánh cắp từ các mã trong data.frame)

+3

+1 - Điều này cũng có vẻ hoạt động: 'my_list <- function (...) setNames (danh sách (...), thay thế (alist (...)))' – flodel

+0

Ngoài ra còn có 'Hmisc :: llist' ví dụ như 'llist (a1, a2, labels = FALSE)' – mnel

4

ý tưởng khác,

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 
+3

Hoặc đơn giản hơn là 'mget (c ('a1', 'a2', 'a3'))' ('mget', không phải là' sapply (... , có được) ' – mnel

Các vấn đề liên quan