mapply多个未定义的参数

时间:2016-11-28 11:38:21

标签: r arguments mapply

假设您有一个未定义的列表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)))

1 个答案:

答案 0 :(得分:2)

正如@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)