2011-12-06 37 views
23

Điều này có vẻ như một cách dễ dàng (và có thể là), nhưng vì tôi là braindead, tôi đã sẵn sàng để có được trên bức tường xấu hổ.Lặp lại đối tượng danh sách n lần

Làm thế nào để sao chép đối tượng danh sách n lần và kết thúc nó trong danh sách sau đó? Một cái gì đó như thế này:

list(foo = "", bar = 0) 

để có được:

list(
    list(foo = "", bar = 0), 
    list(foo = "", bar = 0) 
    ) 


LƯU Ý: cho vòng được coi là gian lận

Trả lời

32

Vâng, rep công trình (và là "vectorized") nếu bạn chỉ đơn giản là quấn danh sách trong danh sách khác ...

x <- list(foo = "", bar = 0) 
rep(list(x), 2) 

lừa Đó cũng có thể được sử dụng để gán NULL đến một phần tử trong một danh sách:

x[2] <- list(NULL) 
4

Đôi khi một vòng lặp là đơn giản nhất:

x <- list(foo = "", bar = 0) 
lx <- vector("list", 2) 
for (i in 1:length(lx)) lx[[i]] <- x 

Nếu bạn cần tên riêng, bạn có thể phân bổ chúng cùng một lúc với names(lx) <- ... hoặc tạo danh sách từ danh sách trống và chỉ mục cho mỗi bổ sung lx[[i]] - ít hiệu quả hơn phân bổ trước.

Một cách hơi phức tạp hơn là để lapply trên một vector có độ dài n:

lapply(1:2, function(j) x) 

Chỉ cần đặt trong một hình nộm j cho mỗi phần tử và trở biến của bạn trivially (sử dụng các giả định đáng ngờ về phạm vi).

2

Có lẽ replicate? Một cái gì đó như:

L <- list(foo = "", bar = 0) 
W <- replicate(10, L, FALSE) 
8

Dưới đây là một kịch bản hai dòng mà những gì bạn muốn:

el <- list(foo = "", bar = 0) 
dups <- list(el)[rep(1,N)] 

Lưu ý rằng điều này sẽ làm việc cho bất kỳ đối tượng "el", không chỉ là một danh sách. Nó sử dụng thủ thuật lập chỉ mục một danh sách giống như một vectơ, với ký hiệu đơn [] (và các chỉ số lặp lại).

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