映射多个未定义的参数

mapply multiple undefined arguments

假设你有一个未定义的 nr 个列表作为函数的可能参数,例如可以选择以下 3 个(这个例子尽可能简单,所以向量存储在列表中):

a <- list(c(1,2,3,4,5))
b <- list(c(3,6,7,2,1))
c <- list(c(3,9,8))

如果我想计算所有三个列表的交集,可以按如下方式完成:

Map(intersect,c,Map(intersect,a,b))
# or equivalent:
mapply(intersect,c,mapply(intersect,a,b,SIMPLIFY=F))
# [1] 3

但是如何将参数的 nr 更改为未定义?我读到 ...,但我无法让它工作。第一个想法是写一个函数,它可以有多个由 ...:

定义的列表参数
intersectio <- function(...){
  Map(function(...){
    intersect(...)
  })
}

问:但这当然行不通,因为相交必须递归应用。有什么方法可以在 R 中实现这一点吗?

Q2:这是一个更新后的嵌套列表结构示例。在这种情况下如何完成,即将父列表的每个子列表与其他父列表的关联子列表(相同索引)相交?

a <- list(list(c(1,2,3,4,5)),list(c(3,6,7,2,1)),list(c(3,9,8)))
b <- list(list(c(1,2)),list(c(3,6,9,11,12)),list(c(3)))
c <- list(list(c(1,9)),list(c(65,23,12)),list(c(14,15)))

正如@Roland 所建议的,您可以使用Reduce 来解决您的问题。在平面列表的情况下(如问题的第一个版本),您可以使用以下内容:

Reduce(intersect, c(a, b, c))

在嵌套列表的情况下(如更新后的问题),您只需将其包装在 mapply 调用中:

mapply(function(...) Reduce(intersect, c(...)), a, b, c) 

概括地说,您可以定义一个函数,然后使用任意数量的参数调用它。

list_intersect <- function(...){
  mapply(function(...) Reduce(intersect, c(...)), ...) 
}
list_intersect(a, b, c)