创建一个可变长度`alist()`

时间:2013-07-19 17:13:15

标签: r

在此Answer中,建议使用alist()作为创建包含空元素的列表的简单方法。一个用例就是构建一个适合通过[安排的do.call()调用的列表。例如:

x <- matrix(1:6, ncol = 2)
do.call(`[`, alist(x, , 2)) ## extract column 2 of x

[1] 4 5 6

提示alist()答案的特定Question需要根据对象shortdim动态设置空参数。

如果有人知道有多少维度可以做到

al <- alist( , , ) ## 3 arguments for a 2-d object
al[[1]] <- x
shortdim <- 1
al[[shortdim + 1]] <- 1:2 ## elements 1 & 2 of dim shortdim, plus all other dims
do.call(`[`, al) 

> do.call(`[`, al) 
     [,1] [,2]
[1,]    1    4
[2,]    2    5
> x[1:2, ]         ## equivalent too
     [,1] [,2]
[1,]    1    4
[2,]    2    5

动态长度列表可以由vector()创建,例如

ll <- vector(mode = "list", length = length(dim(x)) + 1)

alist无法以这种方式制作

> vector(mode = "alist", length = length(dim(x)) + 1)
Error in vector(mode = "alist", length = length(dim(x)) + 1) : 
  vector: cannot make a vector of mode 'alist'.

有没有办法创建alist的动态长度,可以在以后需要时填写?

2 个答案:

答案 0 :(得分:15)

好的,我会咬人的。我可能会使用list(bquote())来构建一个包含空符号的单元素列表,并使用rep来表示所需的长度。

n <- 2
rep(list(bquote()), n)
# [[1]]
# 
# 
# [[2]]
# 
# 

作为奖励,以下是创建/访问每个列表元素内容所需的空符号的5种方法的集合:

bquote()
# 
substitute()
# 
quote(expr= )
# 
formals(function(x) {})$x
# 
alist(,)[[1]]
# 

答案 1 :(得分:4)

感谢Ferdinand Kraft:

# no. of elements in the alist
n <- 5
a <- rep(alist(,)[1], n)