Индексирование списка с пустым индексом

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

> (l <- list(a = 1, b = 2))
$a
[1] 1

$b
[1] 2

> (l[] <- list(c = 3))
$c
[1] 3

> l
$a
[1] 3

$b
[1] 3

> l[]
$a
[1] 3

$b
[1] 3

вопросы:

  1. почему вывод из второго оператора отличается от вывода из третьего оператора? Разве назначение не должно возвращать объект присваивается, и в этом случае второй оператор должен давать тот же результат, что и третий?
  2. как получилось, что назначение во втором операторе привело к выходу, показанному после третьего оператора? Каковы правила, регулирующие присвоение пусто индексированного списка?
  3. откуда четвертый оператор yield выход показал? Каковы правила индексирования списка с пустым индексом, когда он не находится в левой части задание?

2 ответов


короче l[] возвращает весь список.

(l <- list(a = 1, b = 2))
l[]

l[] <- list(c=3) по существу переназначает то, что было назначено каждому индексу, чтобы теперь быть результатом list(c=3). Для этого примера, это то же самое, что l[[1]] <- 3 и l[[2]] <- 3. От ?'[' страница, в которой несколько раз упоминается пустая индексация:

когда выражение индекса появляется в левой части назначения (известного как subassignment), то эта часть x устанавливается в значение правая сторона задания.

и

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

Итак, я примерно понимаю, что это означает каждый индекс l следует оценить до list(c=3).

при вводе (l[] <- list(c = 3)) возвращается значение замены. Когда вы затем введите l или l[] вы увидите, что значения в каждый индекс был заменен на list(c=3).


В дополнение к предыдущему ответу, это проверить. Обратите внимание, что поведение полностью совпадает с обычными векторами и списками, поэтому оно не может быть помечено как "специфичное для списка".

v <- 1:3
names(v) <- c("one", "two", "three")
r <- 4:5
names(r) <- c("four", "five")
(v[] <- r)

  four  five 
     4     5 
Warning message:
In v[] <- r :
  number of items to replace is not a multiple of replacement length

v

  one   two three 
    4     5     4

назначение через подмножество сохраняет начальные атрибуты (здесь, имена). Таким образом, имена с правой стороны назначения теряются. Что также важно, назначение через поднабор следует правилам утилизации. В вашем примере все значения переназначены на 3, в моем примере происходит частичная переработка с предупреждением из-за несовместимости длины.

подводя итог,

  1. задание <- возвращает оцененную правую сторону до применение правил утилизации.
  2. это происходит из-за обработка, поскольку длины двух объектов различаются.
  3. без оператора присваивания, l или v по существу то же самое, что l[] или v[].