如何通过“无"作为`[`的子集的参数? [英] How to pass "nothing" as an argument to `[` for subsetting?
问题描述
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
,请参见此处(Hadley,使用bquote
)或此处(使用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
I was hoping to be able to construct a do.call
formula for subsetting without having to identify the actual range of every dimension in the input array.
The problem I'm running into is that I can't figure out how to mimic the direct function x[,,1:n,]
, where no entry in the other dimensions means "grab all elements."
Here's some sample code, which fails. So far as I can tell, either [
or do.call
replaces my NULL
list values with 1
for the index.
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))
I suppose I could kludge a solution by assigning the value -2*max(dim(x))
to each element of dimlist
, but yuck.
(FWIW, I have alternate functions which do the desired job either via melt/recast
or the dreaded "build a string and then eval(parse(mystring))
, but I wanted to do it "better.")
Edit: as an aside, I ran a version of this code (with the equivalent of DWin's TRUE setup) against a function which used melt & acast
; the latter was several times slower to no real surprise.
After some poking around, alist
seems to do the trick:
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
From ?alist
:
‘alist’ handles its arguments as if they described function arguments. So the values are not evaluated, and tagged arguments with no value are allowed whereas ‘list’ simply ignores them. ‘alist’ is most often used in conjunction with ‘formals’.
A way of dynamically selecting which dimension is extracted. To create the initial
alist
of the desired length, see here (Hadley, using bquote
) or here (using 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
这篇关于如何通过“无"作为`[`的子集的参数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!