2015-03-02 23 views
5

Chciałbym dodać iteracyjnie elementy listy w R, aby późniejsze elementy mogły korzystać z elementów utworzonych wcześniej. Pożądane zachowanie jest następujące:iteracyjne dodawanie elementów do listy w jednym kroku

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

Wiem, że mogę łatwo osiągnąć to samo, np. Za pomocą np.

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

Ale zastanawiałem się, czy mógłbym to zrobić w jednym kroku.

Odpowiedz

5

Aktualizacja: To jest teraz możliwe dzięki funkcji lst pakietu tibble:

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

Moje poprzednie obejście używał mutate z plyr:

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

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

Oto kolejny sposób

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

Bardziej klasyczny pomysł:

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 

Do ścisłego iteracyjnego podejścia, pętla jest potrzebne:

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 
Powiązane problemy