如果foo <- list(),foo[[length(foo)+1]] <- bar当我真正想写的时候,我发现自己写了很多东西push(foo, bar).
同样地(尽管不那么频繁)bar <- foo[[length(foo)]]会更好bar <- pop(foo).
这是重复的变量名称杀死了我.考虑:
anInformative.selfDocumenting.listName[[length(anInformative.selfDocumenting.listName)+1]] <- bar
Run Code Online (Sandbox Code Playgroud)
编辑:
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)
Run Code Online (Sandbox Code Playgroud)
按预期提供10个对象的列表.
foo <- list()
for (i in 1:10) {
x <- data.frame(a=i, b=rnorm(1,0,1))
foo <- append(foo, x)
}
str(foo)
Run Code Online (Sandbox Code Playgroud)
给出了20个对象的列表.
MrF*_*ick 12
foo[[length(foo)+1]] <- bar
Run Code Online (Sandbox Code Playgroud)
可以改写为
foo <- append(foo, bar)
Run Code Online (Sandbox Code Playgroud)
和
bar <- foo[[length(foo)]]
Run Code Online (Sandbox Code Playgroud)
可以改写为
bar <- tail(foo,1)
Run Code Online (Sandbox Code Playgroud)
请注意,使用R函数等函数语言通常不会更改传递给它们的参数值; 通常你会返回一个可以在别处分配的新对象.该功能应该没有"副作用".像push/pop其他语言一样的函数通常会修改其中一个传递的参数.
晚了几年,但这是需要最少打字量的方法。请注意,这pop会从对象中删除最后一个元素。
push <- function(obj, input) {
variable <- deparse(substitute(obj))
out <- get(variable, envir = parent.frame(n=2))
out[[length(out)+1]] <- input
assign(variable, out, envir = parent.frame(n=2))
}
pop <- function(obj) {
variable <- deparse(substitute(obj))
obj <- get(variable, envir = parent.frame(n=2))
if (length(obj) > 0) {
out <- obj[[length(obj)]]
assign(variable, obj[-length(obj)], envir = parent.frame(n=2))
}else{
out <- NULL
assign(variable, out, envir = parent.frame(n=2))
}
return(out)
}
Run Code Online (Sandbox Code Playgroud)
例子:
> foo <- list()
> push(foo, "a")
> push(foo, "b")
> foo
[[1]]
[1] "a"
[[2]]
[1] "b"
> pop(foo)
[1] "b"
> foo
[[1]]
[1] "a"
Run Code Online (Sandbox Code Playgroud)