2015-03-02 65 views
5

我想在R中迭代地添加列表元素,以便后面的元素可以使用先前创建的元素。期望的行为如下:在一个步骤中反复添加元素列表

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

我知道我可以很容易地完成相同的使用,例如,

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

但我想知道,如果我可以一步做到这一点。

回答

5

更新:现在这是可能的tibble包的lst功能:

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

我以前的解决方法是使用mutateplyr

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

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

这里的另一种方式

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

比较经典的想法:

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 

了严格的迭代方法,需要一个循环:

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 
相关问题