【问题标题】:why does `x[0]` return a zero-length vector?为什么`x[0]`返回一个零长度向量?
【发布时间】:2012-05-23 13:22:40
【问题描述】:

假设我有一个向量,例如x <- 1:10,那么x[0] 返回一个与x 相同类的零长度向量,这里是integer(0)

我想知道这个选择背后是否有原因,而不是抛出错误,或者像 x[11] 那样返回 NA?此外,如果您能想到让x[0] 返回integer(0) 很有用的情况,感谢您将其包含在您的答案中。

【问题讨论】:

  • 出于同样的原因 x[FALSE] 这样做
  • @TylerRinker:初步看来,这是一个有趣的问题,因为尚未明确定义的x[0] 返回integer(0),而同样未明确定义的x[11] 返回NA。此外,显式分配x[0] <- 5 不会返回错误或警告,但x[0] 仍然是integer(0)
  • @TylerRinker,我想我明白为什么x[FALSE] 返回一个长度为零的向量:当使用逻辑(真/假)提取时,需要提供一个与x 长度相同的向量.所以在你的例子中,FALSE 被回收导致x[rep(FALSE, length(x))],我并不惊讶它返回integer(0)。同样,x[TRUE] 将返回 x。但我没有看到您在x[0]x[FALSE] 之间建立的链接。能详细点吗?
  • 这是基于 1 的索引而不是 zero-based indexing 的结果,但可以理解是出乎意料的。
  • 因为你不能混合 +ve 和 -ve 索引,忽略 0 可能是正确的答案:x[0:11] 返回 ` [1] 1 2 3 4 5 6 7 8 9 10 NA` 和x[-(0:5)] 返回[1] 6 7 8 9 10。但我看不出这有什么用处。

标签: arrays r


【解决方案1】:

?"["中所见

允许使用 NA 和零值:索引矩阵的行包含 零被忽略,而包含 NA 的行在 结果。

所以 0 的索引会被忽略。我们可以在下面看到这一点

x <- 1:10
x[c(1, 3, 0, 5, 0)]
#[1] 1 3 5

因此,如果我们给它的唯一索引是 0,那么适当的响应是返回一个空向量。

【讨论】:

  • 谢谢@Dason。我认为值得注意的是,您引用的句子是“矩阵和数组”部分的一部分,而不是“原子向量”,因此它没有明确记录或回答我的问题,但也许可以用于外推。
  • 无论哪种方式,虽然它可以帮助讨论,但我对“因为文档这么说”的答案不太感兴趣;我更感兴趣的是为什么做出这个特殊的选择。其他一些答案和 cmets 提供了一些合理的解释,说明为什么它不应该像 x[11] 那样返回 NA。所以我想知道为什么开发人员没有选择抛出错误。
  • 错误会很糟糕,因为在像拆分这样的情况下,您希望它返回一些不是错误的东西。 :) 仍然在推动我提出的这个想法,听起来很合理。
  • @TylerRinker 你知道它在拆分中使用 0 索引吗?我怀疑这就是拆分的内部原理。
  • @Dason 拜托你,我都知道我不知道。
【解决方案2】:

由于数组索引是从 1 开始的,因此索引 0 没有任何意义。该值作为向量索引被忽略。

【讨论】:

    【解决方案3】:

    因为我不是程序员,所以我对此很感兴趣,当然也不会为 R 源代码做出贡献。我认为这可能是因为您需要某种占位符来说明此处发生了某些事情但没有返回任何内容。这在tablessplit 之类的东西上变得更加明显。例如,当您制作一个值表并说该单元格为零时,您需要保持由向量中的字符串组成的该单元格没有值。 x[0]==0 是不合适的,因为它不是零的数值,而是没有任何值。

    因此,在下面的拆分中,我们需要一个占位符,integer(0) 保存没有返回值的位置,它与 0 不同。注意第二个它返回的 numeric(0) 仍然是一个占位符,说明它是数字占位符。

    with(mtcars, split(as.integer(gear), list(cyl, am, carb)))
    with(mtcars, split(gear, list(cyl, am, carb)))
    

    所以在某种程度上我的x[FALSE] 反驳是正确的,因为它保留了向量中不存在的零点的位置。

    好吧,我刚刚吐出的这个 balonga 是真的,直到有人提出异议并将其撕毁。

    本指南第 19 页 (LINK) 声明 integer() and integer(0) are empty integer.

    相关 SO 帖子: How to catch integer(0)?

    【讨论】:

    • 我仍然觉得这不能回答为什么它不像 x[11] 那样返回 NA 的问题。
    • 因为x[11] 确实存在,所以它只是丢失了。尝试x[15] &lt;- 3;x,您会在向量中看到除了0 之外的每个整数值在技术上都存在。即使x[Inf] 存在,它也只是缺少(NA),而x[0] 永远不会存在。将x[n] 视为定位,这是有道理的。没有 x[0] 位置这样的东西。
    • @TylerRinker:我同意你的观点,但只是为了进一步讨论,如果 x[0] 不存在,为什么x[0] &lt;- 1 不返回警告或错误?难道我们不希望它返回类似invalid first argument 的东西,也就是assign(x[0], 1) 返回的错误消息吗?
    • @jthetzel 这不是一个很好的例子,因为assign(x[1], 1) 也给出了无效的第一个参数。但是assign("x[1]", 1)assign("x[0]", 1) 都成功了。
    • @Dason:感谢您指出这一点。不过,出于好奇,我想知道为什么x[0] &lt;- 1 没有错误。
    猜你喜欢
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 2021-11-02
    • 1970-01-01
    • 2021-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多