在对数组进行子集化时,R的行为会有所不同,具体取决于其中一个维度的长度是否为1。如果维度的长度为1,则在子集化期间该维度将丢失:
ax <- array(1:24, c(2,3,4))
ay <- array(1:12, c(1,3,4))
dim(ax)
#[1] 2 3 4
dim(ay)
#[1] 1 3 4
dim(ax[,1:2,])
#[1] 2 2 4
dim(ay[,1:2,])
#[1] 2 4
从我的观点来看,ax和ay是相同的,对它们执行相同的子集操作应返回具有相同尺寸的数组。我可以看到R处理这两种情况的方式可能很有用,但在我编写的代码中它是不可取的。这意味着当我将子集化数组传递给另一个函数时,如果我碰巧在较早阶段将维度缩减为长度1,则该函数将获得缺少维度的数组。 (所以在这种情况下,R的灵活性使我的代码不那么灵活!)
如何在子集化过程中防止R丢失长度为1的维度?还有另一种索引方式吗?有些标志要设置吗?
答案 0 :(得分:17)
正如您在默认情况下发现的那样,R会丢弃不必要的尺寸。索引时添加drop=FALSE
可以防止这种情况:
> dim(ay[,1:2,])
[1] 2 4
> dim(ax[,1:2,])
[1] 2 2 4
> dim(ay[,1:2,,drop = F])
[1] 1 2 4