Почему индексация "вне границ" отличается между матрицей и data.frame?

Я уверен, что это довольно просто, но я бы хотел по-настоящему понять логику структур данных R здесь.

Если я подставляю матрицу по индексу за пределами границ, я получаю именно эту ошибку:

m <- matrix(data = c("foo", "bar"), nrow = 1)
m[2,]
# Error in m[2, ] : subscript out of bounds

Однако, если я делаю то же самое, делаю фрейм данных, я получаю все строки NA:

df <- data.frame(foo = "foo", bar = "bar")
df[2,]
#    foo  bar
# NA <NA> <NA>

Если я помещаю в несуществующий столбец фрейма данных, я получаю знакомый

df[, 3]
# Error in '[.data.frame'(df, , 3) : undefined columns selected

Я знаю (примерно), что строки фрейма данных являются странными и требуют осторожного обращения, но я не совсем вижу связь с вышеуказанным поведением.

Может кто-нибудь объяснить, почему R ведет себя таким образом для несуществующих строк df?

Обновить

Надо отметить, что задание NA для недопустимых подмножеств является нормальным поведением R для одномерных векторов:

vec <- c("foo", "bar")
vec[3]
# [1] NA

Таким образом, в некотором смысле странным здесь является подмножество матриц, а не подмножество фреймов данных, в зависимости от того, с чего вы начинаете. Тем не менее, другое поведение двумерного поднабора (m[2, ] vs df[2, ]) может показаться плотному пользователю (как я сейчас) непоследовательным.

Ответы

Ответ 1

Может кто-нибудь объяснить, почему R ведет себя таким образом [?]

Краткий ответ: нет, вероятно нет.


Более длинный ответ: Давным-давно я думал о чем-то похожем и читал эту тему на R-devel: Определение [[. В основном это сводится к:

Семантика [ и [[ не представляется полностью определенной в Справочном руководстве. [...] Я предполагаю, что это функции, а не ошибки, но я не могу найти документацию для них

Дункан Мердок, бывший член основной команды R, дает очень хороший ответ:

На странице руководства для Extract есть больше документации, но я думаю, что она неполная. Самая полная документация - это, конечно, исходный код *, но он может не отвечать на вопрос о том, что является преднамеренным, а что случайным.

Как упомянуто в теме R-devel, единственное описание в руководстве - 3.4.1. Индексация по векторам:

Если i положительно и превышает length(x) то соответствующий выбор равен NA

Но это относится к "индексированию простых векторов". Подобное индексирование вне границ для "непростых" векторов, по-видимому, не описано. Дункан Мердок снова:

Так что же такое простой вектор? Это явно не определено, и, вероятно, должно быть.

Таким образом, может показаться, что никто не знает ответа на ваш вопрос "почему".


См. Также "8.2.13 несуществующее значение в индексе" в превосходном R Inferno Патрика Бернса и раздел "Индексы отсутствия/выхода за пределы" в книге Хэдли.


* Исходный код для оператора [ subset. Поиск R_MSG_subs_o_b (который соответствует сообщению об ошибке "индекс за пределами границ") не дает очевидной подсказки, почему OOB [ индексирование матриц и при использовании [[ выдают ошибку, тогда как OOB [ индексирование "простых векторов" приводит к NA.