迭代地将元素一步添加到列表中

时间:2015-03-02 11:17:39

标签: r

我想在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']]

但我想知道,如果我能一步到位。

3 个答案:

答案 0 :(得分:6)

这是另一种方式

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

答案 1 :(得分:5)

更新:现在可以使用lst包的tibble功能:

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

我以前的解决方法是使用mutate中的plyr

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

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

答案 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