Индексирование списка с пустым индексом
методика индексирования фрейма данных с пустым индексом есть несколько раз в Расширенный 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[]
.