首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带NULL的子设置数组不删除维度?

带NULL的子设置数组不删除维度?
EN

Stack Overflow用户
提问于 2016-03-26 23:41:46
回答 1查看 146关注 0票数 4

我想知道这种违约行为背后是否有什么原因?如果有一些一致性的怪癖,我会很高兴知道。

下面有两个不同的查询(结果是20和0长度),但我希望它们在删除冗余维度方面具有相同的行为。由于某种原因,NULL的子集似乎保持了空维度。?drop声明:

删除只有一个级别的数组的维度。

drop=TRUE保持0级维有什么意义?

我正在开发类似数组的类,正因为如此,我遇到了与base::array不一致的地方。我应该向R平台报告这样的问题吗?

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-25 20:57:41

实际上,如果在您的示例中使用drop=FALSE,您将看到在第一种情况下,第一个维度有一个级别,而在第二个维度中有0级。因此,下降的行为并非完全不一致。抱歉我看到你意识到了这一点。但是这样做的结果是r2是一个没有条目的数组。由于条目的数量必须等于维度的乘积,所以按照您的要求删除第一个维度会产生错误。换句话说:您可以因为1*5*4=5*4而降低一个级别,而不能因为0*5*4=0而降低0级别,这与5*4不同。

具体地回答你的问题:

  1. 是的,这种默认行为背后是有原因的。您不能删除0级别的维度,因为如果其余维度的级别超过零,则在删除后,条目数(0)将不再与维度的乘积匹配。
  2. 保持0级维度的要点是,将数组设为NULL的结果是一个没有条目的数组。这与数组(1层)的切片不同,该数组仍然有条目,不能被视为一维少的数组。因此,对于0级别,下降是没有意义的(如果有0级的话,其他可能的行为可能是删除所有维度,但是您会丢失信息,例如,关于酒窝的信息)。
  3. 不,您不应该向R平台报告此问题。
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36242181

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档