首页 > 解决方案 > 如何使用 rapply 将其中带有标量的列表替换为带有标量的列表和一个或多个列表?

问题描述

我有两个列表RD我想将它们组合起来生成 list P。最终列表的元素是独一无二的。但是,如果 的头部D和列表中的字符元素匹配R,我想用 替换list("C"), list("C", list("D", list("E"))。这个例子有点太简单了,因为在我的问题中可能有更深的嵌套。所以,我想我想要一个使用类似rapply.

P = list("A", list("B"), list("C", list("D"), list("E"))
R = list("A", list("B"), list("C"))
D = list(list("C", list("D"), list("E")))
for(d in D) {
  p = d[[1]]
  R <- rapply(R, function(x) if(identical(x, p)) {
    d
  } else {
    x
  }, how = "list")
}
R

不幸的是,这并不完全正确,因为它将 R 变异为类似的东西P,但是在 C 周围有一个“残留”列表作为附加层(这是一个仅包含一个列表的列表)。有没有办法避免这种情况,或者有必要编写一个递归函数来在事后进行清理,就像我尝试使用trim下面的过程一样?

is_vestige = function(x) {
  length(x) == 1 && all(vapply(x, is.list, TRUE))
}

trim = function(x) {
  n = length(x)
  if(n == 0) {
    return(NULL)
  }
  if(n == 1) {
    if(is_vestige(x)) {
      return(trim(x[[1]]))
    } else {
      return(x)
    }
  }  else {
    return(Map(trim, x))
  }
}

标签: r

解决方案


推荐阅读