Указатель на вложенный элемент списка - PullRequest
2 голосов
/ 24 апреля 2020

Возьмите следующий список:

lst <- list(a = 1, b = list(c = 2, d = 3))

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

d <- lst[['b']][['d']] # d should be a reference.
update(d, 5) # custom function for updating by reference.
lst[['b']][['d']]
#> [1] 5 

Зачем мне это? Потому что я делаю всевозможные обновления в списках на несколько уровней, что приводит к утомительному коду, подобному следующему:

lst[['b']][['d']] <- some_function(lst[['b']][['d']], lst[['b']][['c']])

Поэтому мне интересно, есть ли в R идиомы, которые сделали бы код более кратким и читаемый

Ответы [ 2 ]

2 голосов
/ 24 апреля 2020

Вот решение base - purrr, которое не тестировалось в очень глубоких списках:

lapply(lst, function(x) purrr::modify_at(x,2,function(x) 5))

Или, как предложено @akrun, modify_in, которое отменяет необходимость в lapply:

modify_in(lst, list('b', 'd'), ~ 5)

Результат:

$a
[1] 1

$b
$b$c
[1] 2

$b$d
[1] 5
2 голосов
/ 24 апреля 2020

Мы могли бы использовать assign_in из purrr, если мы можем предоставить имена или индекс вложенного list

library(purrr)
assign_in(lst, list('b', 'd'), 5)
#$a
#[1] 1

#$b
#$b$c
#[1] 2

#$b$d
#[1] 5

или magrittr для обновления исходного объекта

library(magrittr)
lst %<>%
   assign_in(list('b', 'd'), 5)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...