Почему `x [0]` возвращает вектор нулевой длины?

Скажем, у меня есть вектор, например x <- 1:10, тогда x[0] возвращает вектор нулевой длины того же класса, что и x, здесь integer(0).

Мне было интересно, есть ли причина этого выбора, а не бросать ошибку или возвращать NA как x[11]? Кроме того, если вы можете подумать о ситуации, когда полезно использовать x[0] return integer(0), спасибо за то, что вы включили его в свой ответ.

Ответ 1

Как видно из ?"["

NA и нулевые значения разрешены: строки индексной матрицы, содержащие ноль игнорируются, тогда как строки, содержащие NA, вызывают NA в результат.

Таким образом, индекс 0 просто игнорируется. Мы можем видеть это в следующем

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

Итак, если единственный указатель, который мы даем, равен 0, то соответствующий ответ должен вернуть пустой вектор.

Ответ 2

Так как индексы массива основаны на 1, индекс 0 не имеет значения. Значение игнорируется как векторный индекс.

Ответ 3

Моя трещина в нем, поскольку я не программист и, конечно же, не способствую источнику R. Я думаю, это может быть потому, что вам нужен какой-то владелец места, чтобы заявить, что что-то произошло здесь, но ничего не было возвращено. Это становится более очевидным с такими вещами, как tables и split. Например, когда вы делаете таблицу значений и говорите, что есть нуль этой ячейки, вам нужно удержать, что эта ячейка, сделанная из строки в векторе, не имеет значений. было бы нецелесообразно иметь 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] истинна тем, что она удерживает место несуществующего нуля в векторе.

Хорошо, что эта балонга, которую я просто извергала, верна, пока кто-то не оспаривает ее и не разорвет ее.

PS стр. 19 этого руководства (LINK) укажите, что integer() and integer(0) are empty integer.

Связанная публикация SO: Как поймать целое число (0)?