Замените все значения рекурсивного списка значениями вектора

Скажем, у меня есть следующий рекурсивный список:

rec_list <- list(list(rep(1,5), 10), list(rep(100, 4), 20:25))
rec_list
[[1]]
[[1]][[1]]
[1] 1 1 1 1 1

[[1]][[2]]
[1] 10


[[2]]
[[2]][[1]]
[1] 100 100 100 100

[[2]][[2]]
[1] 20 21 22 23 24 25

Теперь я хотел бы заменить все значения списка, скажем, вектором seq_along(unlist(rec_list)), и сохранить структуру списка. Я попытался использовать пустую подмножество индекса, например

rec_list[] <- seq_along(unlist(rec_list))

Но это не сработает.

Как я могу добиться замены при сохранении исходной структуры списка?

Ответы

Ответ 1

Вы можете использовать relist:

relist(seq_along(unlist(rec_list)), skeleton = rec_list)
# [[1]]
# [[1]][[1]]
# [1] 1 2 3 4 5
# 
# [[1]][[2]]
# [1] 6
# 
# 
# [[2]]
# [[2]][[1]]
# [1]  7  8  9 10
# 
# [[2]][[2]]
# [1] 11 12 13 14 15 16

Ответ 2

Если вы хотите однозначно индексировать каждый элемент вложенного списка, вы можете начать с функции rapply(), которая является рекурсивной формой семейства apply(). Здесь я использую специальную функцию, которая может однозначно индексировать список любой структуры

rapply(rec_list, 
local({i<-0; function(x) {i<<-i+length(x); i+seq_along(x)-length(x)}}),     
how="replace")

другие функции проще, например, если вы просто захотите выполнить seq_along каждый подвектор

rapply(rec_list, seq_along, how="replace")