映射 R 中列表中的元素对

mon*_*nic -1 r mapply

如果我有一个对称二元运算符,我想将其应用于列表中的元素对,有没有一种简单的方法可以在 R 中做到这一点?我试过:

A <- list(1,2,3)
mapply(function(x,y) x+y, A,A)
Run Code Online (Sandbox Code Playgroud)

但这只给出了x[n]+y[n]所有内容n=1..N,但我希望x[n]+y[m]所有内容都m=1..n, n=1..N作为列表返回。outer(..)这样做涉及m=1..N, n=1..N冗余计算,所以我想打折它。

请注意,我不需要这个简单示例的解决方案。我需要一个也适用于非数字输入的通用解决方案。我想做的事情是这样的:

mapply(function(set_1, set_2) setequal(intersect(set_1, set_2),  set_3), list_of_sets, list_of_sets)
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,加法和交集都是对称的。在第一个示例中,我期望list(3,4,5)list(1+2,1+3,2+3). 对于第二种情况,我的输入list_of_sets是:

> list_of_sets
[[1]]
numeric(0)

[[2]]
[1] 1

[[3]]
[1] 2

[[4]]
[1] 1 2

[[5]]
[1] 3

[[6]]
[1] 1 3

[[7]]
[1] 2 3

[[8]]
[1] 1 2 3
Run Code Online (Sandbox Code Playgroud)

set_3作为c(1,2)一个简单的例子。

Ron*_*hah 5

您可以使用outer-

values <- c(1, 2, 3)
outer(values, values, `+`)

#     [,1] [,2] [,3]
#[1,]    2    3    4
#[2,]    3    4    5
#[3,]    4    5    6
Run Code Online (Sandbox Code Playgroud)

outer也适用于非数字输入。如果您要应用的函数未矢量化,您可以使用Vectorize. 由于OP没有提供示例,我创建了自己的示例。

list_of_sets_1 <- list(c('a', 'b', 'c'), c('a'))
list_of_sets_2 <- list(c('a', 'c'), c('a', 'b'))

fun <- function(x, y) intersect(x, y)
result <- outer(list_of_sets_1, list_of_sets_2, Vectorize(fun))
result
Run Code Online (Sandbox Code Playgroud)