我想知道是否有任何原因导致这种默认行为?如果有一些关于它的一致性怪癖,我很乐意知道。
以下是两个不同的查询(结果分别为20和0),但我希望它们在删除冗余维度方面具有相同的行为。出于某种原因,使用NULL
进行子集操作似乎会保留空维度。 ?drop
指令如下:
删除只有一个级别的数组的维度。
使用drop=TRUE
时为什么要保留0级维度呢?
我正在开发类似数组的类,由于这个问题,我遇到了与base::array
的不一致之处。我应该向R dev平台报告这样的问题吗?
set.seed(1L)
ar.dimnames = list(color = sort(c("green","yellow","red")),
year = as.character(2011:2015),
status = sort(c("active","inactive","archived","removed")))
ar.dim = sapply(ar.dimnames, length)
ar = array(sample(c(rep(NA, 4), 4:7/2), prod(ar.dim), TRUE),
unname(ar.dim),
ar.dimnames)
r1 = ar["green",,,drop=TRUE]
dimnames(r1)
#$year
#[1] "2011" "2012" "2013" "2014" "2015"
#
#$status
#[1] "active" "archived" "inactive" "removed"
#
length(r1)
#[1] 20
r2 = ar[NULL,,,drop=TRUE]
dimnames(r2)
#$color
#NULL
#
#$year
#[1] "2011" "2012" "2013" "2014" "2015"
#
#$status
#[1] "active" "archived" "inactive" "removed"
#
length(r2)
#[1] 0
ar[NA_integer_,,]
而不是NULL
或0L
。 - Frankc(5,4)
,当前的dimnames
将保持不变,没有第一个元素。 - jangorecki?drop
中写道:“删除仅包含一个级别的数组的维度。” 没有提及如何处理零个级别。 - Frankc(5,4)
维度,否则当prod(c(5,4))
时就不会评估为0。因此,0维度是正确的,因为prod(c(0,5,4))
将评估为0长度。@user7669的答案在这里也非常准确。 - jangorecki