首页 > 解决方案 > 列表的变异逻辑

问题描述

我想使用该列表的现有插槽将元素添加到列表中。在基础R中,我将使用以下语法:

l <- list(a = 1, b = 2, e = 1, f = 1)
## Add slot c and d  which take the values from a and b respectively
l$c <- l$a
l$d <- l$b
str(l)
# List of 6
#  $ a: num 1
#  $ b: num 2
#  $ e: num 1
#  $ f: num 1
#  $ c: num 1
#  $ d: num 2

l$可以通过我不想使用的attach/ with/来避免。within

那么这样做的规范方法是什么tidyverse?我能想到的一种解决方案是:

library(magrittr)
library(purrr)
l <- list(a = 1, b = 2, e = 1, f = 1)
str(l %$% list_modify(l, c = a, d = b))
str(l)
# List of 6
#  $ a: num 1
#  $ b: num 2
#  $ e: num 1
#  $ f: num 1
#  $ c: num 1
#  $ d: num 2

但是由于其中有很多函数,tidyverse我想知道是否有一个“更”适合目的的函数,即使用可能较少不同的库/函数调用?


更新。稍微修改了示例以突出显示并非所有列都将被复制。

标签: rtidyverse

解决方案


不是一个整洁的方式,但你可以这样做:

append_list <- function(l, copy_from, copy_to) {
  if(length(copy_from) != length(copy_to)) 
    stop('length of copy_from and copy_to should be equal')
  l[copy_to] <- l[copy_from]
  l
}

append_list(l, c('a', 'b'), c('c', 'd'))

#$a
#[1] 1

#$b
#[1] 2

#$e
#[1] 1

#$f
#[1] 1

#$c
#[1] 1

#$d
#[1] 2
append_list(l, c('a', 'b'), c('c', 'd', 'e'))

append_list(l, c("a", "b"), c("c", "d", "e")) 中的错误:copy_from 和 copy_to 的长度应该相等


推荐阅读