我希望能够构造一个用于子集的do.call公式,而不必标识输入数组中每个维度的实际范围。
我遇到的问题是我无法弄清楚如何模仿直接函数x[,,1:n,],在该函数中,其他维中没有任何条目表示“抢占所有元素”。

这是一些示例代码,但失败了。据我所知,[do.callNULL替换我的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/

10-12 17:09