映射多个未定义的参数
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)
假设你有一个未定义的 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)