Я думаю, что это может быть просто неправильно задокументировано в текущем документе определения языка R.
Как вы обнаружили, поведение противоположно тому, что описано.Обратите внимание, что в вашем примере, если вы используете v[1:length(v)]
, вы получаете ожидаемое поведение от v[]
.Таким образом, пустое []
является исключением, которое возвращает атрибуты без изменений.
В поисках ответа я нашел иллюстративный коммит / комментарий (см. Различия здесь: https://github.com/wch/r-source/commit/6b3480e05e9671a517d70c80b9f3aac53b6afd9d#diff-3347e77b1c102d875a744a2cd7fa86e5) Автор описывает поведение, которое вызаметил:
Поднабор (кроме пустого индекса) обычно удаляет все атрибуты, кроме @code {names}, @code {dim} и @code {dimnames}, которые сбрасываются при необходимости.с другой стороны, субнаправление обычно сохраняет атрибуты даже при изменении длины. Принуждение удаляет все атрибуты.
Я думаю, что если подмножество []
пусто, возвращаемый объект является просто копиейисходный объект.
РЕДАКТИРОВАТЬ (из комментариев ниже):
Причина, по которой атрибуты v
и v[]
отображаются в другом порядке, скорее всего из-за того, как атрибутыприсваиваются новому подмножеству в этом особом случае подмножества с пустым индексом. Кроме того, другой порядок не должен рассматриваться как ошибка, потому чтоатрибуты не должны иметь порядок (см. help(attributes)
.Обратите внимание, что в help(``[``)
поведение, которое вы наблюдали, точно описано (в отличие от определения языка, на которое вы ссылались), и объясняет, почему нужно такое поведение:
Пустой индекс выбирает все значения: эточаще всего используется для замены всех> записей, но сохраняет «атрибуты». "