Сегодня я работал со списком списков, и мне нужно было заменить элемент одного из списков второго уровня. Способ сделать это казался очевидным, но я понял, что не совсем понимаю, почему это сработало.
Вот пример:
a <- list(aa=list(aaa=1:10,bbb=11:20,ccc=21:30),bb=list(ddd=1:5))
Учитывая эту структуру данных, допустим, я хочу заменить 3-й элемент вложенного числового вектора aaa. Я мог бы сделать что-то вроде:
newvalue <- 100
a$aa$aaa[3] <- newvalue
Делать это кажется достаточно очевидным, но я не мог объяснить себе, как на самом деле это выражение оценивается. Работая с функцией кавычек, я собрал воедино некоторую грубую логику, например:
(1) Создайте и отправьте вызов функции верхнего уровня:
`<-`(a$aa$aaa[3],newvalue)
(2) Ленивая оценка первого аргумента в (1), вызов функции '[':
`[`(a$aa$aaa,3)
(3) Приступить рекурсивно вниз:
`$`(a$aa,"aaa")
(4) ... далее, снова позвоните '$':
`$`(a,"aa")
(5) С (4), возвращая фактическую структуру данных, продолжайте обратно «вверх по стеку», заменяя возвращенные структуры данных, пока фактическое назначение не будет выполнено в (1).
Я предполагаю, что моя путаница связана с некоторыми аспектами ленивой оценки и / или сред оценки. В приведенном выше примере я просто переназначил один элемент вектора. Но как получается, что R отслеживает, где этот вектор находится в большей структуре данных?
Приветствия