2015-03-02 13 views
5

Tôi muốn thêm các phần tử danh sách lặp lại trong R, để các phần tử sau này có thể sử dụng các phần tử được tạo trước đó. Hành vi mong muốn như sau:lặp lại việc thêm các phần tử vào danh sách trong một bước

lst <- list(a = 1, 
      b = 2, 
      c = b) 
lst 
## $a 
## [1] 1 
## 
## $b 
## [1] 2 
## 
## $c 
## [1] 2 

Tôi biết rằng tôi có thể dễ dàng thực hiện tương tự bằng cách sử dụng ví dụ:

lst <- list(a = 1, 
      b = 2) 
lst[['c']] <- lst[['b']] 

Nhưng tôi đã tự hỏi, nếu tôi có thể làm điều này trong một bước.

Trả lời

5

Cập nhật: Điều này bây giờ có thể với các lst chức năng của gói tibble:

tibble::lst(a = 1, b = 2, c = b) 
## $a 
## [1] 1 
## 
## $b 
## [1] 2 
## 
## $c 
## [1] 2 

workaround trước đây của tôi đã sử dụng mutate từ plyr:

mylist <- function(...) plyr::mutate(.data=list(), ...) 

mylist(a = 1, 
     b = 2, 
     c = b) 
## $a 
## [1] 1 
## 
## $b 
## [1] 2 
## 
## $c 
## [1] 2 
6

Dưới đây là một cách khác để

rev(within(list(), { a = 1; b = 2; c = b })) 
# $a 
# [1] 1 
# 
# $b 
# [1] 2 
# 
# $c 
# [1] 2 
2

Một ý tưởng cổ điển hơn:

mylist = function(...) 
{ 
    args = as.list(substitute(list(...)))[-1]  
    lapply(args, eval, envir = args) 
} 
mylist(a = 1, b = 2, c = a + b) 
#$a 
#[1] 1 
# 
#$b 
#[1] 2 
# 
#$c 
#[1] 3 

Đối với một cách tiếp cận lặp nghiêm ngặt, một vòng lặp là cần thiết:

mylist = function(...) 
{ 
    args = as.list(substitute(list(...)))[-1] 
    for(i in seq_along(args)) args[[i]] = eval(args[[i]], envir = args) 
    return(args) 
} 
mylist(a = 1, b = a + 1, c = b + 1) 
#$a 
#[1] 1 
# 
#$b 
#[1] 2 
# 
#$c 
#[1] 3 
Các vấn đề liên quan