我想知道这种默认行为背后是否有任何原因?如果有一些一致性的怪癖,我会很高兴知道。
下面是两个不同的查询(长度分别为20和0),但我希望它们在删除冗余维度方面具有相同的行为。由于某种原因,NULL
的子集似乎保持了空维度。?drop
状态:
删除只有一个级别的数组的维度。
用drop=TRUE
保持0级维度有什么意义?
我正在开发类似数组的类,因此我遇到了与base::array
不一致的问题。我应该向研发平台报告这样的问题吗?
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
事实上,如果您在示例中使用drop=FALSE,您会看到在第一种情况下,第一个维度有1个级别,而在第二种情况下它有0个级别。因此,drop的行为并非完全不一致。对不起,我知道你已经意识到了。但这样做的结果是r2是一个没有条目的数组。由于条目的数量必须等于维度的乘积,因此如果您希望删除第一个维度,则会产生错误。换句话说:当你有一个级别时,你可以下降,因为1*5*4=5*4,而你不能下降0个级别,因为0*5*4=0,这与5*4不同。
具体回答您的问题:
-
是的,这种默认行为背后是有原因的。不能删除级别为0的维度,因为如果其余维度的级别超过零,则在删除后,条目数(0)将不再与维度的乘积匹配。
-
保持0级维度的意义在于,用NULL对数组进行子集设置的结果是一个没有条目的数组。这不同于数组的切片(1级),它仍然有条目,不能被视为少一维的数组。因此,对于0级来说,删除是没有意义的(如果一个人有0级,可能唯一可能的行为就是删除所有维度,但你会丢失信息,例如在dimnames上)。
-
不,您不应该向R开发平台报告此问题。