2015-03-02 7 views
5

Vorrei aggiungere elementi di elenco in modo iterativo in R, in modo che gli elementi successivi possano utilizzare gli elementi creati in precedenza. Il comportamento desiderato è il seguente:iterativamente aggiungendo elementi all'elenco in un solo passaggio

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

So che posso eseguire facilmente lo stesso utilizzando per es.

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

Ma mi stavo chiedendo, se potessi farlo in un solo passaggio.

risposta

5

Aggiornamento: Questo è ora possibile con la funzione lst del pacchetto tibble:

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

mia soluzione precedente utilizzava mutate da plyr:

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

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

Ecco un altro modo

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

Un'idea più classico:

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 

Per un approccio rigoroso iterativo, è necessario un ciclo:

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 
Problemi correlati