在R中推送和弹出列表的更好方法是什么?

时间:2015-02-24 03:46:08

标签: r

如果foo <- list(),我发现自己写了很多foo[[length(foo)+1]] <- bar,我真的只想写push(foo, bar)

同样(尽管频率低得多)bar <- foo[[length(foo)]]会比bar <- pop(foo)更好。

  1. 在基础R中有更好的方法吗?
  2. 如果不这样做,是否有人编写了一个使这些基本列表操作不那么语法错误的包?
  3. 重复导致我死亡的变量名称。考虑:

    anInformative.selfDocumenting.listName[[length(anInformative.selfDocumenting.listName)+1]] <- bar
    

    编辑:

    foo <- append(foo, bar)对我不起作用

    foo <- list()
    for (i in 1:10) {
      x <- data.frame(a=i, b=rnorm(1,0,1))
      foo[[length(foo)+1]] <- x
    }
    str(foo)
    

    按预期提供10个对象的列表。

    foo <- list()
    for (i in 1:10) {
      x <- data.frame(a=i, b=rnorm(1,0,1))
      foo <- append(foo, x)
    }
    str(foo)
    

    提供20个对象的列表。

3 个答案:

答案 0 :(得分:9)

foo[[length(foo)+1]] <- bar

可以改写为

foo <- append(foo, bar)

bar <- foo[[length(foo)]]

可以改写为

bar <- tail(foo,1)

请注意,使用R函数等函数式语言通常不会更改传递给它们的参数值;通常你会返回一个可以在别处分配的新对象。该功能应该没有副作用。&#34;其他语言中的push/pop等函数通常会修改其中一个传递的参数。

答案 1 :(得分:0)

pushR = function(foo, bar){
  foo[[length(foo)+1]] <- bar
  foo
}

popR=function(foo){
  foo[[length(foo)]]
}

foo <- list()
for (i in 1:10) {
  x <- data.frame(a=i, b=rnorm(1,0,1))
  foo <- pushR(foo, x)
}

popR(foo)

答案 2 :(得分:0)

foo <- list()
for (i in 1:10) {
  x <- data.frame(a=i, b=rnorm(1,0,1))
  foo[[length(foo)+1]] <- x
}

可以写为:

foo <- list()
for (i in 1:10) {
 x <- data.frame(a=i, b=rnorm(1,0,1))
 foo[[i]] <- x
}

如果您担心重复变量名。我同意通过lapply可以在整个代码的性能和长度方面更有效地工作。