Индексирование списка с пустым индексом
методика индексирования фрейма данных с пустым индексом есть несколько раз в Расширенный 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
вопросы:
- почему вывод из второго оператора отличается от вывода из третьего оператора? Разве назначение не должно возвращать объект присваивается, и в этом случае второй оператор должен давать тот же результат, что и третий?
 - как получилось, что назначение во втором операторе привело к выходу, показанному после третьего оператора? Каковы правила, регулирующие присвоение пусто индексированного списка?
 - откуда четвертый оператор 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, в моем примере происходит частичная переработка с предупреждением из-за несовместимости длины.
подводя итог,
- задание 
<-возвращает оцененную правую сторону до применение правил утилизации. - это происходит из-за обработка, поскольку длины двух объектов различаются.
 - без оператора присваивания, 
lилиvпо существу то же самое, чтоl[]илиv[].