我希望能够构造一个用于子集的do.call
公式,而不必标识输入数组中每个维度的实际范围。
我遇到的问题是我无法弄清楚如何模仿直接函数x[,,1:n,]
,在该函数中,其他维中没有任何条目表示“抢占所有元素”。
这是一些示例代码,但失败了。据我所知,[
或do.call
用NULL
替换我的1
列表值作为索引。
x<-array(1:6,c(2,3))
dimlist<-vector('list', length(dim(x)))
shortdim<-2
dimlist[[shortdim]] <- 1: (dim(x)[shortdim] -1)
flipped <- do.call(`[`,c(list(x),dimlist))
我想我可以通过为
-2*max(dim(x))
的每个元素分配值dimlist
来解决一个问题,但是幸。(FWIW,我有一些替代功能,它们可以通过
melt/recast
或可怕的“先生成一个字符串,然后再eval(parse(mystring))
来完成所需的工作,但我想做得更好”。)编辑:顺便说一句,我针对使用
melt & acast
的函数运行了此代码的一个版本(与DWin的TRUE设置等效);后者慢了几倍,也就不足为奇了。 最佳答案
经过一番摸索之后,alist
似乎可以解决问题:
x <- matrix(1:6, nrow=3)
x
[,1] [,2]
[1,] 1 4
[2,] 2 5
[3,] 3 6
# 1st row
do.call(`[`, alist(x, 1, ))
[1] 1 4
# 2nd column
do.call(`[`, alist(x, , 2))
[1] 4 5 6
来自
?alist
:“ alist”会像处理功能一样处理其参数
论点。因此,不评估值和带标签的参数
没有值是允许的,而“列表”只是忽略它们。
“ alist”通常与“ formal”结合使用。
动态选择提取哪个维度的方法。要创建所需长度的初始
alist
,请参见here(Hadley,使用bquote
)或here(使用alist
)。m <- array(1:24, c(2,3,4))
ndims <- 3
a <- rep(alist(,)[1], ndims)
for(i in seq_len(ndims))
{
slice <- a
slice[[i]] <- 1
print(do.call(`[`, c(list(m), slice)))
}
[,1] [,2] [,3] [,4]
[1,] 1 7 13 19
[2,] 3 9 15 21
[3,] 5 11 17 23
[,1] [,2] [,3] [,4]
[1,] 1 7 13 19
[2,] 2 8 14 20
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
关于r - 如何将“无”作为参数传递给`[`进行子集化?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17750893/