Применять пустые скобки в атрибутах R drop?(чтение определения языка R) - PullRequest
0 голосов
/ 19 декабря 2018

Определение языка R (для версии 3.5.1) гласит

Выражение x[] возвращает x, но удаляет «нерелевантные» атрибуты из результата.Сохраняются только names и в многомерных массивах dim и dimnames атрибуты.

Но рассмотрим следующий пример:

v <- factor(c(dog = 1, cat = 3))
attr(v, "label") <- "feeling confused"
attributes(v)
# $`names`
# [1] "dog" "cat"
# 
# $levels
# [1] "1" "3"
# 
# $class
# [1] "factor"
# 
# $label
# [1] "feeling confused"
attributes(v[])
# $`names`
# [1] "dog" "cat"
# 
# $levels
# [1] "1" "3"
# 
# $label
# [1] "feeling confused"
# 
# $class
# [1] "factor"

Порядок атрибутов изменен, новсе атрибуты сохранены .

all.equal(attributes(v)[c(1,2,4,3)], attributes(v[]))
# [1] TRUE

Почему мой пример исключен?Или чего мне не хватает?

1 Ответ

0 голосов
/ 28 декабря 2018

Я думаю, что это может быть просто неправильно задокументировано в текущем документе определения языка 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(``[``) поведение, которое вы наблюдали, точно описано (в отличие от определения языка, на которое вы ссылались), и объясняет, почему нужно такое поведение:

Пустой индекс выбирает все значения: эточаще всего используется для замены всех> записей, но сохраняет «атрибуты». "

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...