Присоединяйтесь к двум именованным спискам, сохраняйте .x, если дублируете - PullRequest
1 голос
/ 06 мая 2019

Я хочу объединить / добавить / объединить / объединить два именованных списка, listA и listB, в один список (listComplete). Если элемент находится в обоих списках, оставьте один и отбросьте другой.

Пусть

listA = list(a = 'a', b = 'b')
listB = list(a = 'a_FromListB', c = 'c') 

Тогда я хочу соединить / объединить эти два в

listComplete = list(a = 'a_FromListB', b = 'b', c = 'c')

Я пытался использовать c, но это повторяет все элементы. Я читал, что base::append - это просто оболочка вокруг c, и по какой-то причине я получаю ошибку на purrr::append (не существует в пространстве имен - я использую purrr 0.3.2). Я также пытался purrr::list_modify, но это "гнездо" listB для элемента a в listA:

purrr::list_modify(listA, listB )
$a
$a$a
[1] "a_FromB"

$a$c
[1] "c"


$b
[1] "b"

Важно

  • сохранить только элемент a из listB,
  • не гнездовые списки,
  • сохранить все остальные (непересекающиеся) элементы.

Бонус заключается в заказе нового списка таким образом, чтобы он начинался с listA (где все элементы, которые также находятся в listB, заменяются значениями в listB), а затем listB.

Я знаю, что могу написать свою собственную функцию, но это, кажется, что-то, что должно быть из коробки - особенно из purrr.

Ответы [ 2 ]

0 голосов
/ 07 мая 2019

Вот еще один способ:

c(listA,`[<-`(listB, names(listA), value = NULL))
#> $a
#> [1] "a"
#> 
#> $b
#> [1] "b"
#> 
#> $c
#> [1] "c"
0 голосов
/ 06 мая 2019

Мы можем использовать duplicated на объединенном names обоих list с, а затем использовать это для фильтрации элементов в объединенном lists

c(listA, listB)[!duplicated(c(names(listA), names(listB)), fromLast = TRUE)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...