Почему `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)?