Arrays 具有NULL的子集数组不删除维度?

Arrays 具有NULL的子集数组不删除维度?,arrays,r,multidimensional-array,Arrays,R,Multidimensional Array,我想知道这种违约行为背后是否有任何原因?如果有一些一致性的怪癖,我很高兴知道 下面是两个不同的查询(长度分别为20和0),但我希望它们在删除冗余维度时具有相同的行为。由于某种原因,NULL的子集似乎保持空维度?下降状态: 删除只有一个级别的数组的维度 使用drop=TRUE保持0级维度有什么意义 我正在开发类似数组的类,因此我遇到了与base::array不一致的问题。我应该向R开发平台报告此类问题吗 set.seed(1L) ar.dimnames = list(color = sort(c(

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

下面是两个不同的查询(长度分别为20和0),但我希望它们在删除冗余维度时具有相同的行为。由于某种原因,
NULL
的子集似乎保持空维度<代码>?下降状态:

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

使用
drop=TRUE
保持0级维度有什么意义

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

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个级别。因此,跌落的行为并非完全不一致。对不起,我看到你意识到了这一点。但这样做的结果是r2是一个没有条目的数组。由于条目数必须等于维度数的乘积,因此如果您希望删除第一个维度,则会产生错误。换句话说:当你有一个级别时,你可以删除,因为1*5*4=5*4,而你不能删除0个级别,因为0*5*4=0,这与5*4不同

具体回答您的问题:

  • 是的,这种默认行为背后有一些原因。不能删除级别为0的维度,因为如果其余维度的级别超过零,则删除后,条目数(0)将不再与维度的乘积匹配

  • 保持0级别维度的要点是,将数组子集为NULL的结果是没有条目的数组。这不同于仍然有条目的数组切片(1级),不能将其视为一维数组。因此,对于0个级别,删除没有意义(如果一个级别为0,则可能唯一的其他行为是删除所有维度,但您将丢失信息,例如DIMNAME)

  • 不,您不应该向R开发平台报告此问题


  • 不清楚您希望输出是什么样子。它应该是0 5 4还是只有5 4?在前一种情况下,dimnames应该继续存在是很自然的。我可能会选择
    ar[NA_integer,,]
    而不是
    NULL
    0L
    。相关c代码:是的,但事实是0L级别维度基本信息甚至不如1L级别维度信息有用
    drop=T
    应该处理这个问题,如果它已经在删除提供了一些数据的维度info@Roland我想这是有文档记录的:
    ?drop
    说“删除只有一个级别的数组的维度”。没有提到处理零级别。@Frank nice catch。我希望长度结果为0,因此它基本上不能有
    c(5,4)
    dim,当
    prod(c(5,4))
    时,dim不会计算为0。0维度是正确的,因为
    prod(c(0,5,4))
    将计算为0长度。@user7669给出的答案也很贴切。谢谢。我在答案中增加了一些细节。希望现在它更像一个正确的答案。@Milap谢谢。我已经具体回答了这些问题。希望现在它更像一个正确的答案。是的,这是一个答案!感谢您接受建设性的建议并付诸行动。祝你好运